program mire;
var f,g:text;
a,t,b:array of array of longint;
v:array of longint;
viz:array of 0..1;
nrc,nr,i,j,n,m:longint;
procedure citire;
var i,x,y:longint;
begin
assign(f,'ctc.in'); reset(f);
assign(g,'ctc.out'); rewrite(g);
readln(f,n,m);
setlength(a,n+1,1);
setlength(v,n+1);
setlength(viz,n+1);
setlength(t,n+1,1);
setlength(b,n+1,1);
for i:=1 to m do
begin
readln(f,x,y);
inc(a[x,0]);
setlength(a[x],a[x,0]+1);
a[x,a[x,0]]:=y;
inc(t[y,0]);
setlength(t[y],t[y,0]+1);
t[y,t[y,0]]:=x;
end;
close(f);
end;
procedure topo(nod:longint);
var i:longint;
begin
viz[nod]:=1;
for i:=1 to a[nod,0] do
if viz[a[nod,i]]=0 then
topo(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
citire;
nr:=n+1;
for j:=1 to n do
if viz[j]=0 then
topo(j);
for j:=1 to n do
viz[j]:=0;
nrc:=0;
for j:=1 to n do
if viz[v[j]]=0 then
begin
inc(nrc);
df(v[j]);
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(g);
end.