#define rep(i, x, y) for(int i = x; i < y; ++i)
#define int ll
/*预处理*/
int low[1000010], dfn[1000010], n, m, head[1000010], stk[1000010];
int top, cnt, dfncnt, scccnt, color[100010], vis[1000010];
int x[1000100], y[1000010], deg[1000010], f[1000010];
int maxn[1000010];
struct Edge {
int to, nxt;
} e[2000010];
void add(int u, int v) {
e[++cnt].to = v;
e[cnt].nxt = head[u];
head[u] = cnt;
}
void tarjan(int u) { //tarjan缩点算法
vis[u] = 1;
stk[++top] = u;
dfn[u] = low[u] = ++dfncnt;
for(int i = head[u]; i; i = e[i].nxt) {
int v = e[i].to;
if(!dfn[v]) {
tarjan(v);
low[u] = min(low[u], low[v]);
}
else if(vis[v]) low[u] = min(low[u], dfn[v]);
}
if(low[u] == dfn[u]) {
++scccnt;
while(stk[top] != u) {
vis[stk[top]] = 0;
color[stk[top]] = scccnt;
maxn[scccnt] = max(maxn[scccnt], stk[top]); // maxn记录当前scc中最大点值
--top;
}
maxn[scccnt] = max(maxn[scccnt], u);
vis[stk[top]] = 0;
color[stk[top]] = scccnt;
--top;
}
}
void dfs(int u, int fa) { //DFS
f[u] = maxn[u];
for(int i = head[u]; i; i = e[i].nxt) {
int v = e[i].to;
if(v == fa) continue;
dfs(v, u);
f[u] = max(f[u], f[v]);
}
}
signed main() {
read(n), read(m);
rep(i, 0, m) {
read(x[i]), read(y[i]);
add(x[i], y[i]);
}
/*tarjan*/
rep(i, 1, n + 1) if(!dfn[i]) tarjan(i);
/*建新图*/
memset(e, 0, sizeof(e));
memset(head, 0, sizeof(head));
cnt = 0;
rep(i, 0, m) if(color[x[i]] != color[y[i]]) ++deg[color[y[i]]], add(color[x[i]], color[y[i]]);
/*DFS*/
rep(i, 1, scccnt + 1) if(!f[i]) dfs(i, i);
rep(i, 1, n + 1) print(f[color[i]], ' ');
return 0;
}