program ctc_2;
var g,gt,ctc:array of array of longint;
viz1,viz2:array[1..100000] of 0..1;
sol:array[1..100000] of longint;
i,k,x,y,n,m,nr,j:longint;
bufin,bufout:array[1..65535] of byte;
procedure df1(nod:longint);
var i:longint;
begin
viz1[nod]:=1;
for i:=1 to g[nod,0] do
if viz1[g[nod,i]]=0 then
df1(g[nod,i]);
inc(k);
sol[k]:=nod;
end;
procedure df2(nod:longint);
var i:longint;
begin
viz2[nod]:=1;
for i:=1 to gt[nod,0] do
if viz2[gt[nod,i]]=0 then
df2(gt[nod,i]);
ctc[nr,0]:=ctc[nr,0]+1;
setlength(ctc[nr],ctc[nr,0]+1);
ctc[nr,ctc[nr,0]]:=nod;
end;
begin
assign(input,'ctc.in'); reset(input);
assign(output,'ctc.out'); rewrite(output);
settextbuf(input,bufin);
settextbuf(output,bufout);
readln(n,m);
setlength(g,n+1,1);
setlength(gt,n+1,1);
for i:=1 to m do
begin
readln(x,y);
inc(g[x,0]);
setlength(g[x],g[x,0]+1);
g[x,g[x,0]]:=y;
inc(gt[y,0]);
setlength(gt[y],gt[y,0]+1);
gt[y,gt[y,0]]:=x;
end;
k:=0;
for i:=1 to n do
if viz1[i]=0 then
df1(i);
nr:=0;
setlength(ctc,n+1,1);
for i:=n downto 1 do
if viz2[sol[i]]=0 then
begin
inc(nr);
df2(sol[i]);
end;
writeln(nr);
for i:=1 to nr do
begin
for j:=1 to ctc[i,0] do
write(ctc[i,j],' ');
writeln;
end;
close(input); close(output);
end.