#include <bits/stdc++.h>
using namespace std;
#define int long long
const int maxn = 2e5 + 5;
vector<int> adj[maxn];
vector<bool> vis(maxn, false);
vector<int> radj[maxn];
vector<int> ans;
vector<int> dist(maxn, 1e18);
vector<int> dp(maxn, 1e18);
int n, m;
void dfs(int x){
if(vis[x] == 1) return;
vis[x] = 1;
for(int X: adj[x]){
if(!vis[X]) dfs(X);
}
ans.push_back(x);
}
void ts() {
for (int i = 0; i < maxn; i++) vis[i] = false;
ans.clear();
for(int i = 0; i < n; i++) dfs(i);
reverse(ans.begin(), ans.end());
}
signed main(){
cin >> n >> m;
for (int i = 0; i < m; i++) {
int u, v;
cin >> u >> v;
adj[u].push_back(v);
radj[v].push_back(u);
}
queue<int> q;
dist[0] = 0;
q.push(0);
while(!q.empty()) {
int u = q.front();
q.pop();
for (int v: adj[u]) {
if(dist[v] == 1e18) {
dist[v] = dist[u] + 1;
q.push(v);
}
}
}
ts();
dp[n - 1] = 0;
for (int i = ans.size() - 1; i >= 0; i--) {
int u = ans[i];
if(u == n-1) continue;
int mn = 1e18;
for (int X : adj[u]) {
if (dp[X] != 1e18) mn = min(mn, max(dist[u], 1 + dp[X]));
}
dp[u] = mn;
}
for (int i = 0; i <n-1; i++) cout << dp[i] << ' ';
return 0;
}