rt,
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5, M = 2e5;
int ind[N], h[N], dis[N], n, m, idx;
queue<int>q;
struct res {
int to, nxt;
} edge[M];
void add(int a, int b) {
edge[idx].to = b;
edge[idx].nxt = h[a];
h[a] = idx++;
}
void init() {
memset(h, -1, sizeof(h));
scanf("%d %d", &n, &m);
for (int i = 1; i <= m; i++) {
int u, v;
scanf("%d %d", &u, &v);
add(u, v);
ind[v]++;
}
}
void topsort() {
for (int i = 1; i <= n; i++) {
if (!ind[i]) {
q.push(i);
dis[i]++;
}
}
while (!q.empty()) {
for (int i = h[q.front()]; i != -1; i = edge[i].nxt) {
int v = edge[i].to;
dis[v] = max(dis[v], dis[q.front()] + 1);
ind[v]--;
if (!ind[v])
q.push(v);
}
q.pop();
}
}
int main() {
init();
topsort();
for (int i = 1; i <= n; i++)
printf("%d\n", dis[i]);
return 0;
}