program ctc;
var f,g:text;
a,t,b:array of array of longint;
viz,v:array of longint;
n,m,i,nr,nrc,j:longint;
bufin,bufout:array[1..65000] of byte;
procedure citire;
var i,x,y:longint;
begin
readln(f,n,m);
setlength(a,n+1,1);
setlength(t,n+1,1);
for i:=1 to m do
begin
readln(f,x,y);
inc(a[x,0]);
inc(t[y,0]);
setlength(a[x],a[x,0]+1);
setlength(t[y],t[y,0]+1);
a[x,a[x,0]]:=y;
t[y,t[y,0]]:=x;
end;
end;
procedure dft(nod:longint); ///sortarea topologica
var i:longint;
begin
viz[nod]:=1;
for i:=1 to a[nod,0] do
if viz[a[nod,i]]=0 then
dft(a[nod,i]);
dec(nr);
v[nr]:=nod;
end;
procedure df(nod:longint);
var i:longint;
begin
viz[nod]:=1;
inc(b[nrc,0]);
setlength(b[nrc],b[nrc,0]+1);
b[nrc,b[nrc,0]]:=nod;
for i:=1 to t[nod,0] do
if viz[t[nod,i]]=0 then
df(t[nod,i]);
end;
begin
assign(f,'ctc.in');
reset(f);
assign(g,'ctc.out');
rewrite(g);
settextbuf(f,bufin);
settextbuf(g,bufout);
citire;
setlength(viz,n+1);
setlength(v,n+1);
nr:=n+1;
for i:=1 to n do
if viz[i]=0 then
dft(i);
for i:=1 to n do
viz[i]:=0;
nrc:=0;
setlength(b,n+1,1);
for i:=1 to n do
if viz[v[i]]=0 then
begin
inc(nrc);
df(v[i]);
end;
writeln(g,nrc);
for i:=1 to nrc do
begin
for j:=1 to b[i,0] do
write(g,b[i,j],' ');
writeln(g);
end;
close(f);
close(g);
end.