#include"bits/stdc++.h"
using namespace std;
const int N=1e6+5,inf=36501;
int dfn[N],low[N],Time,stk[N];
int tp=0,inscc[N],cnt,que[N],dp[N];
bool instk[N],vis[N];
int n,m,x,y,a,b,r,l,in[N];
vector<int>c[N],g[N];
void tarjan(int cur){
dfn[cur]=low[cur]=++Time;
stk[tp++]=cur;instk[cur]=1;
for(int i=0;i<c[cur].size();i++){
int nxt=c[cur][i];
if(!dfn[nxt]){
tarjan(nxt);
low[cur]=min(low[cur],low[nxt]);
}
else if(instk[nxt])
low[cur]=min(low[cur],dfn[nxt]);
}
if(dfn[cur]==low[cur]){
++cnt;
do{
inscc[stk[--tp]]=cnt;
instk[stk[tp]]=0;
}
while(stk[tp]!=cur&&tp);
}
}
void topsort(){
r=0,l=1;
for(int i=1;i<=n;i++)
if(in[i]==0)
que[++r]=i;
dp[inscc[n]]=1;
while(l<=r){
int cur=que[l++];
for(int i=0;i<g[cur].size();i++){
int nxt=g[cur][i];
if(dp[cur])
vis[nxt]|=vis[cur];
dp[nxt]=min(inf,dp[nxt]+dp[cur]);
in[nxt]--;
if(in[nxt]==0)
que[++r]=nxt;
}
}
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin>>n>>m;
n++;
for(int i=1;i<=m;i++){
cin>>x>>y;
c[x].push_back(y);
}
for(int i=1;i<=n;i++)
if(!dfn[i])
tarjan(i);
for(int i=1;i<=n;i++){
for(int j=0;j<c[i].size();j++){
int nxt=c[i][j];
if(inscc[i]==inscc[nxt]){
vis[inscc[i]]=1;
}
else{
in[inscc[i]]++;
g[inscc[nxt]].push_back(inscc[i]);
}
}
}
topsort();
int ans=0,num=0;
for(int i=1;i<n;i++){
if(dp[inscc[i]]!=0&&vis[inscc[i]]==1){
dp[inscc[i]]=inf;
}
ans=max(ans,dp[inscc[i]]);
}
if(ans==inf)
cout<<"zawsze\n";
else
cout<<ans<<'\n';
for(int i=1;i<=n;i++)
if(ans==dp[inscc[i]])
num++;
cout<<num<<'\n';
for(int i=1;i<n;i++)
if(ans==dp[inscc[i]])
cout<<i<<' ';
return 0;
}