#include <bits/stdc++.h>
using namespace std;
const int N=2e6+10;
int h[N],to[N],ne[N],tot,t;
int h2[N],to2[N],ne2[N],num,d[N];
int n,mmm,id[N],low[N],dfn[N],st[N],top,cnt,maxx[N],ans[N];
bool inst[N],vis[N];
vector<int> v[N];
void add(int x,int y){
++tot;to[tot]=y;ne[tot]=h[x];h[x]=tot;
}
void add2(int x,int y){
++num;to2[num]=y;ne2[num]=h2[x];h2[x]=num;
}
void ta(int x){
low[x]=++t;dfn[x]=t;
st[++top]=x;inst[x]=true;
for(int i=h[x];i;i=ne[i]){
int y=to[i];
if(!dfn[y]){
ta(y);
low[x]=min(low[x],low[y]);
}else if(inst[y]){
low[x]=min(low[x],dfn[y]);
}
}
if(low[x]==dfn[x]){
cnt++;int y;
do{
y=st[top--];inst[y]=false;
id[y]=cnt;
v[cnt].push_back(y);
}while(y!=x);
}
}
void topo(){
queue<int> q;
for(int i=1;i<=cnt;i++){
if(d[i]==0){
q.push(i);
}
}
while(q.size()){
int u=q.front();q.pop();
for(int i=h2[u];i;i=ne2[i]){
int y=to2[i];
d[y]--;maxx[y]=max(maxx[y],maxx[u]);
if(d[y]==0){
q.push(y);
}
}
}
}
int main(){
cin>>n>>mmm;
while(mmm--){
int xx,xy;scanf("%d%d",&xx,&xy);
add(xx,xy);
}
ta(1);
for(int i=1;i<=n;i++)
for(int j=h[i];j;j=ne[j]){
int y=to[j];
if(id[y]==id[i]){
maxx[id[i]]=max(maxx[id[i]],i);
maxx[id[y]]=max(maxx[id[y]],y);
}else {
add2(id[y],id[i]);
d[id[i]]++;
maxx[id[i]]=max(maxx[id[i]],i);
maxx[id[y]]=max(maxx[id[y]],y);
}
}
topo();
for(int i=1;i<=cnt;i++){
for(int j=0;j<v[i].size();j++){
int y=v[i][j];
ans[y]=max(ans[y],maxx[i]);
}
}
for(int i=1;i<=n;i++)cout<<ans[i]<<' ';
}```