#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define FOR(i,N) for(ll i = 0; i < N; i++)
#define all(x) (x).begin(), (x).end()
#define F first
#define S second
// EGOI25 Currents
const ll INF = 1e18;
signed main() {
cin.tie(0); ios::sync_with_stdio(false);
ll N, M;
cin >> N >> M;
vector<vector<ll>> forw(N), rev(N);
vector<ll> d0(N, INF);//, dN_1(N, INF);
FOR(i, M) {
ll a, b;
cin >> a >> b;
forw[a].push_back(b);
rev[b].push_back(a);
}
queue<pair<ll,ll>> q1;
q1.push({0,0});
while(q1.size()) {
auto [v, d] = q1.front();
q1.pop();
if (d0[v] <= d) continue;
d0[v] = d;
for(ll u: forw[v]) q1.push({u, d+1});
}
// q1.push({N-1,0});
// while(q1.size()) {
// auto [v, d] = q1.front();
// q1.pop();
// if (dN_1[v] <= d) continue;
// dN_1[v] = d;
// for(ll u: rev[v]) q1.push({u, d+1});
// }
vector<ll> res(N, INF);
queue<pair<ll,pair<ll,ll>>> q2;
q2.push({N-1, {0,0}});
while(q2.size()) {
ll v = q2.front().F;
ll d = q2.front().S.F;
ll pd = q2.front().S.S;
q2.pop();
if (res[v] <= max(d, d+pd)) continue;
res[v] = max(d, d+pd);
for(ll u: rev[v]) q2.push({u, {d+1, max(pd, d0[u] - (d+1))}});
}
FOR(i, N-1) cout << res[i] << ' ';
}