# include<iostream>
# include<algorithm>
# include<cmath>
# include<cstring>
# include<stack>
# include<queue>
# define endl "\n"
# define int long long
using namespace std;
const int maxn=100001;
struct Node{
int u, v, next;
}edge[maxn], new_edge[maxn];
int head[maxn], new_head[maxn], cnt=0, t=0, new_cnt=0, tim=0, n, m;
int dfn[maxn], low[maxn], color[maxn], a[maxn], uu[maxn], vv[maxn], dp[maxn], used[maxn];
bool vis[maxn];
stack<int> s;
queue<int> q;
void add(int u, int v) {
cnt++;
edge[cnt].u=u; edge[cnt].v=v; edge[cnt].next=head[u];
head[u]=cnt;
}
void new_add(int u, int v) {
new_cnt++;
new_edge[new_cnt].u=u; new_edge[new_cnt].v=v; new_edge[new_cnt].next=new_head[u];
new_head[u]=new_cnt;
}
void tarjan(int u, int fa) {
int owie=u;
vis[u]=true;
dfn[u]=low[u]=++tim;
s.push(u);
for(int i=head[u]; i; i=edge[i].next) {
int v=edge[i].v;
if(!dfn[v]) {
tarjan(v, u);
low[u] = min(low[u], low[v]);
}else if(vis[v]) low[u] = min(low[u], dfn[v]);
}
if(dfn[u]==low[u]) {
t++;
while(true) {
int temp=s.top(); s.pop();
vis[temp]=0;
color[temp]=t;
a[t]=max(u, a[t]);
if(temp==u) break;
}
}
}
void topsort(int u) {
dp[u]=a[u];
for(int i=new_head[u]; i; i=new_edge[i].next) {
int v=new_edge[i].v;
if(used[v]==u) continue;
used[v]=u;
if(!dp[v]) topsort(v);
dp[u]=max(dp[u], dp[v]);
}
}
signed main() {
cin >> n >> m;
for(int i=1; i<=m; i++) {
cin >> uu[i] >> vv[i];
add(uu[i], vv[i]);
}
for(int i=1; i<=n; i++)
if(!dfn[i])
tarjan(i, 0);
for(int i=1; i<=m; i++)
if(color[uu[i]]!=color[vv[i]])
new_add(color[uu[i]], color[vv[i]]);
for(int i=1; i<=n; i++)
if(!dp[i])
topsort(i);
for(int i=1; i<=n; i++) cout << dp[color[i]] << " ";
return 0;
}