#include<iostream>
#include<vector>
#include<queue>
using namespace std;
const int N=1e4+10;
int cnt1[N];
int cnt2[N];
int n,m;
vector<int> e[N];
int din1[N];
int din2[N];
void toposort(){
priority_queue<int> a;
priority_queue<int,vector<int>,greater<int>> b;
for(int i=1;i<=n;++i){
if(din1[i]==0){
a.push(i);b.push(i);
}
}
int now=0;
while(a.size()){
auto t=a.top();
a.pop();
cnt1[t]=++now;
for(auto x:e[t]){
if(--din1[x]==0) a.push(x);
}
}
now=0;
while(b.size()){
auto t=b.top();
b.pop();
cnt2[t]=++now;
for(auto x:e[t]){
if(--din2[x]==0) b.push(x);
}
}
}
int main(){
cin>>n>>m;
while(m--){
int a,b;cin>>a>>b;
e[a].push_back(b);
din1[b]++;din2[b]++;
}
toposort();
for(int i=1;i<=n;++i) cout<<cnt1[i]<<endl;
for(int i=1;i<=n;++i){
if(cnt1[i]!=cnt2[i]){
cout<<1<<endl;
return 0;
}
}
cout<<0<<endl;
return 0;
}