#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=1e6+5;
const int maxx=36501;
struct node
{
int v,next;
}e[maxn];
int cnt,head[maxn],dfn[maxn],low[maxn],col[maxn],vis[maxn],tim,n,m,x[maxn],y[maxn],tot,ind[maxn],f[maxn],ans,sz[maxn];
bool b[maxn];
void add(int u,int v)
{
e[++cnt].next=head[u];
e[cnt].v=v;
head[u]=cnt;
}
stack<int >s;
void tarjan(int u)
{
bool flag=0;
dfn[u]=low[u]=++tim;
s.push(u);vis[u]=1;
for(int i=head[u];i;i=e[i].next)
{
int v=e[i].v;
if(u==v) flag=1;
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])
{
int x=0;tot++;
if(flag || s.top()!=u) b[tot]=1;
while(x!=u)
{
x=s.top();s.pop();vis[x]=0;
col[x]=tot;sz[tot]++;
}
}
}
queue<int >q;
void topu_sort()
{
f[col[n]]=1;
for(int i=1;i<=tot;i++) if(ind[i]==0) q.push(i);
while(q.size())
{
int u=q.front();q.pop();
if(u==col[n]) continue;
for(int i=head[u];i;i=e[i].next)
{
int v=e[i].v;
ind[v]--;
if(!ind[v]) q.push(v);
}
}
q.push(col[n]);
while(q.size())
{
int u=q.front();q.pop();
if(b[u] && f[u]) f[u]=maxx;
for(int i=head[u];i;i=e[i].next)
{
int v=e[i].v;
f[v]=min(maxx,f[v]+f[u]);
ind[v]--;
if(!ind[v]) q.push(v);
}
}
}
void input()
{
scanf("%d%d",&n,&m);n++;
int u,v;
for(int i=1;i<=m;i++) {scanf("%lld%lld",&x[i],&y[i]);add(y[i],x[i]);}
}
void rebuild()
{
memset(head,0,sizeof(head));
memset(e,0,sizeof(e));
cnt=0;
for(int i=1;i<=m;i++)
{
if(col[x[i]]!=col[y[i]]) add(col[y[i]],col[x[i]]);
ind[col[x[i]]]++;
}
}
void getans()
{
int sum=0;
//for(int i=1;i<=tot;i++) cout<<f[i]<<endl;
for(int i=1;i<=tot;i++) ans=max(ans,f[i]);
if(ans==maxx) printf("zawsze\n");
else printf("%lld\n",ans);
if(ans==f[col[n]]) sum--;
for(int i=1;i<=tot;i++) if(ans==f[i])sum+=sz[i];
printf("%lld\n",sum);
for(int i=1;i<n;i++)
if(f[col[i]]==ans) printf("%lld ",i);
}
void work()
{
for(int i=1;i<=n;i++) if(!dfn[i]) tarjan(i);
rebuild();
topu_sort();
getans();
}
void pp()
{
for(int i=1;i<=n;i++) cout<<col[i]<<endl;
}
signed main()
{
input();
work();
//pp();
printf("\n");
return 0;
}