#include <bits/stdc++.h>
#include <queue>
#define ll long long
using namespace std;
ll n,m,head[20005],cnt,dist[20005];
bool vis[20005];
struct edge{
ll to,nxt,wei;
}e[1234567];
void add(ll u,ll v,ll w){
e[++cnt].to=v;
e[cnt].wei=w;
e[cnt].nxt=head[u];
head[u]=cnt;
}
struct node{
int uuu,ddd;
bool operator <(const node &rhs) const{
return rhs.ddd<ddd;
}
};
priority_queue<node> q;
void init_and_dijkstra(){
for(int i=1;i<=n;i++)
dist[i]=0x3f3f3f3f;
dist[1]=0;
q.push((node){0,dist[1]});
while(!q.empty()){
node fro=q.top();
q.pop();
ll u=fro.uuu;
ll d=fro.ddd;
if(vis[u])
continue;
vis[u]=1;
for(int i=head[u];i;i=e[i].nxt){
ll uu=e[i].to;
if(vis[uu])
continue;
ll dd=e[i].wei;
if(dist[uu]>dist[u]+dd){
dist[uu]=dist[u]+dd;
q.push((node){uu,dist[uu]});
}
}
}
}
int main(){
cin>>n>>m;
ll a,b;
cnt=0;
for(int i=1;i<=m;i++){
cin>>a>>b;
add(a,b,1);
add(b,a,1);
}
init_and_dijkstra();
for(int i=1;i<=n;i++) cout<<dist[i]<<" ";
return 0;
}