#include <iostream>
#include <cstdio>
#include <queue>
#include <cstring>
using namespace std;
inline int read()
{
int x=0,f=1;
char c=getchar();
while(c<'0'||c>'9')
{
if(c=='-') f=-1;
c=getchar();
}
while(c>='0'&&c<='9')
{
x=x*10+c-'0';
c=getchar();
}
return f*x;
}
const int N=500,M=1e5+50,MAX=2147483647;
int n,m,a,b,dis[N],cur[N],s,t,go[N],ans,f[N];
int had[N],to[M*2],nxt[M*2],len[M*2],p=1;
bool flag[N];
void add(int x,int y,int z)
{
nxt[++p]=had[x];
to[p]=y;
len[p]=z;
had[x]=p;
}
int bfs(int s,int t)
{
memset(dis,0,sizeof(dis));
memcpy(cur,had,sizeof(had));
queue <int> que;
que.push(s); dis[s]=1;
while(que.size())
{
int u=que.front();
que.pop();
for(int i=had[u];i;i=nxt[i])
{
int v=to[i];
if(dis[v]||!len[i]) continue;
dis[v]=dis[u]+1;
que.push(v);
}
}
return dis[t];
}
int find(int u,int lim)
{
if(u==t) return lim;
int flow=0;
for(int i=cur[u];i;i=nxt[i])
{
int v=to[i];
cur[u]=i;
if(dis[v]==dis[u]+1&&len[i])
{
int x=find(v,min(lim-flow,len[i]));
flow+=x;
len[i]-=x;
len[i^1]+=x;
if(flow==lim) break;
}
}
if(!flow) dis[u]=-1;
return flow;
}
int fa(int x)
{
if(f[x]==x) return x;
return f[x]=fa(f[x]);
}
int main()
{
n=read(); m=read();
s=0; t=2*n+10;
for(int i=1;i<=m;i++)
{
a=read(); b=read();
add(a,b+n,1); add(b+n,a,0);
}
for(int i=1;i<=n;i++)
{
add(s,i,1); add(i,s,0);
add(i+n,t,1); add(t,i+n,0);
}
while(bfs(s,t)) ans+=find(s,MAX);
for(int i=1;i<=n;i++) f[i]=i;
for(int i=1;i<=n;i++)
for(int j=had[i];j;j=nxt[j])
if(!len[j]&&to[j]-n<=n&&to[j])
f[fa(i)]=fa(to[j]-n);
for(int i=1;i<=n;i++)
if(!flag[i])
{
bool fl=0;
for(int j=1;j<=n;j++)
if(fa(j)==fa(i))
{
flag[j]=1;
cout<<j<<" ";
fl=1;
}
if(fl) cout<<"\n";
}
cout<<n-ans;
return 0;
}