program ctce;
var g,gt,ctc:array of array of longint;
st:array[1..100000] of longint;
viz,vizt:array[1..100000] of 0..1;
bufin,bufout:array[1..65535] of byte;
n,m,i,j,k,sol:longint;
fi,fo:text;
procedure citire;
var i,j,k:longint;
begin
readln(fi,n,m);
setlength(g,n+1,1);
setlength(gt,n+1,1);
setlength(ctc,n+1,1);
for k:=1 to m do
begin
readln(fi,i,j);
g[i,0]:=g[i,0]+1;
setlength(g[i],g[i,0]+1);
g[i,g[i,0]]:=j;
gt[j,0]:=gt[j,0]+1;
setlength(gt[j],gt[j,0]+1);
gt[j,gt[j,0]]:=i;
end;
end;
procedure df(nod:longint);
begin
viz[nod]:=1;
for j:=1 to g[nod,0] do
if viz[g[nod,j]]=0 then
df(g[nod,j]);
k:=k+1;
st[k]:=nod;
end;
procedure dft(nod:longint);
begin
vizt[nod]:=1;
for j:=1 to gt[nod,0] do
if vizt[gt[nod,j]]=0 then
dft(gt[nod,j]);
ctc[sol,0]:=ctc[sol,0]+1;
setlength(ctc[sol],ctc[sol,0]+1);
ctc[sol,ctc[sol,0]]:=nod;
end;
begin
assign(fi,'ctc.in'); reset(fi);
assign(fo,'ctc.out'); rewrite(fo);
settextbuf(fi,bufin);
settextbuf(fo,bufout);
citire;
k:=0;
for i:=1 to n do
if viz[i]=0 then
df(i);
sol:=0;
for i:=n downto 1 do
if vizt[st[i]]=0 then
begin
sol:=sol+1;
dft(st[i]);
end;
writeln(fo,sol);
for i:=1 to sol do
begin
for j:=1 to ctc[i,0] do
write(fo,ctc[i,j],' ');
writeln(fo);
end;
close(fi);
close(fo);
end.