#include<stdio.h>
FILE *f,*g;
long i,n,m,x,y,c1[100900],indm,c2[109000],t1[3][209000],t2[3][209000],fin1[109000],fin2[109000],z,nr1,nr2,nrcomp,ind,q,c[109000],t[3][109000],fin[109000],j,nr,viz1[109000],viz2[1009000],comp[109000],o,vector[109000],viz[109000];
void df(long k)
{ viz1[k]=indm; long p=c1[k]; o++; vector[o]=k;
while(p)
{ if(viz1[t1[1][p]]!=indm) df(t1[1][p]);
p=t1[2][p];
}
}
void dft(long k)
{ viz2[k]=ind; long p=c2[k];
if(!comp[k]&&viz1[k]==indm) { comp[k]=1;
if(c[nrcomp]==0) { nr++; c[nrcomp]=nr; t[1][nr]=k; fin[nrcomp]=nr; }
else { nr++; t[2][fin[nrcomp]]=nr; t[1][nr]=k; fin[nrcomp]=nr; }}
while(p)
{ if(viz2[t2[1][p]]!=ind&&comp[t2[1][p]]==0) dft(t2[1][p]);
p=t2[2][p];
}
}
int main()
{ f=fopen("ctc.in","r"); g=fopen("ctc.out","w");
fscanf(f,"%ld%ld",&n,&m);
for(i=1;i<=m;i++)
{ fscanf(f,"%ld%ld",&x,&y);
if(c1[x]==0) { nr1++; c1[x]=nr1; t1[1][nr1]=y; fin1[x]=nr1; }
else { nr1++; t1[2][fin1[x]]=nr1; t1[1][nr1]=y; fin1[x]=nr1; }
z=x; x=y; y=z;
if(c2[x]==0) { nr2++; c2[x]=nr2; t2[1][nr2]=y; fin2[x]=nr2; }
else { nr2++; t2[2][fin2[x]]=nr2; t2[1][nr2]=y; fin2[x]=nr2; }
}
for(i=1;i<=n;i++) if(!viz1[i])
{ o=0; indm++; df(i);
for(j=1;j<=o;j++) if(!comp[vector[j]]) { nrcomp++; ind++; dft(vector[j]); }
}
fprintf(g,"%ld\n",nrcomp);
for(i=1;i<=nrcomp;i++)
{ q=c[i];
while(q) { fprintf(g,"%ld ",t[1][q]); q=t[2][q]; }
fprintf(g,"\n");
}
fclose(g);
return 0;
}