#include<bits/stdc++.h>
struct b{
	int x,y;
}a[100005];
int Map[305][305];
int n,m,x,y,i,j,k,prt[505];
using namespace std;
int tou(int x)
{
	if(prt[x]==x) return x;
	return prt[x]=tou(prt[x]);
}
void Merge(int f1,int f2)
{
	int i;
	prt[f1]=f2;
	for(i=1;i<=n;i++)
	Map[f2][i]|=Map[f1][i];
	for(i=1;i<=n;i++)
	Map[i][f2]|=Map[i][f1];
}
int ans[305];
queue<int>que;
void bfs()
{
	memset(ans,-1,sizeof(ans));
	que.push(prt[1]);ans[prt[1]]=0;
	while (!que.empty())
	{
		int a=que.front();que.pop();
	    for(int i=1;i<=n;i++)
	    if(Map[a][i])
		{
	    	int x=tou(i);
	    	if(x==a) continue;
	    	else {
	    		if(ans[x]==-1)
	    		{
	    			que.push(x);ans[x]=ans[a]+1;
				}
			}
		}
	}
}
int main()
{
	scanf("%d%d",&n,&m);
	for(i=1;i<=n;i++) prt[i]=i;
	for(i=1;i<=m;i++)
	{
		scanf("%d%d",&x,&y);
		a[i].x=x;a[i].y=y;
		Map[x][y]=1;
	}
	for(i=1;i<=m;i++)
	{
		int f1=tou(a[i].x),f2=tou(a[i].y);
		
		if(f1==f2) continue;
		if(Map[f2][f1]&&Map[f1][f2])
		{
			Merge(f1,f2);continue;
		}
		for(j=1;j<=n;j++)
		if(j!=a[i].x&&j!=a[i].y)
		{
			int f3=tou(j);
		//	cout<<a[i].x<<" "<<a[i].y<<" "<<j<<endl;
		//	cout<<f1<<"s"<<f2<<" "<<f3<<endl;
			if(Map[f2][f3]&&Map[f3][f1]) {
				Merge(f1,f2);
				Merge(f2,f3);
				//cout<<f1<<" "<<f2<<" "<<f3<<endl;
				break;
			}
			
		}
	}
	for(i=1;i<=n;i++) prt[i]=tou(prt[i]);
	bfs();
	for (int i=1;i<=n;i++) printf("%d ",ans[prt[i]]);
}
