program comptareconexe; //cu matr de adiacenta
var fi,fo:text;
n,m,i,dimst,nrel,j,nrcomp:longint;
a,t:array of array of longint;
//matcomp:array[0..10000,0..10000]of longint;
st:array of longint;
viz,viz2:array of 0..1;
procedure citire;
var i,x,y:longint;
begin
readln(fi,n,m);
setlength(a,n+1,1);
setlength(t,n+1,1);
for i:=1 to m do
begin
readln(fi,x,y);
setlength(a[x], length(a[x])+1);
setlength(t[y], length(t[y])+1);
inc(a[x,0]);
a[x,a[x,0]]:=y;
inc(t[y,0]);
t[y,t[y,0]]:=x;
end;
end;
procedure df(nod:longint);
var i:longint;
begin
viz[nod]:=1;
for i:=1 to a[nod,0] do
begin
if viz[a[nod,i]]=0 then
df(a[nod,i]);
end;
inc(dimst);
st[dimst]:=nod;
end;
procedure dfst(nod:longint);
var i:longint;
begin
viz2[nod]:=1;
inc(nrel);
setlength(a[nrcomp],nrel+1);
a[nrcomp,nrel]:=nod;
for i:=1 to t[nod,0] do
if viz2[t[nod,i]]=0 then
dfst(t[nod,i]);
end;
begin
assign(fi,'ctc.in'); reset(fi);
assign(fo,'ctc.out'); rewrite(fo);
citire;
//prima parcurgere
setlength(viz,n+1);
setlength(st,n+1);
setlength(viz2,n+1);
for i:=1 to n do
if viz[i]=0 then
df(i);
//parcurgerea pe graf transpus
for i:=dimst downto 1 do
begin
if viz2[st[i]]=0 then
begin
inc(nrcomp);
nrel:=0; //din comp conexa curenta
setlength(a[nrcomp],1);
dfst(st[i]);
a[nrcomp,0]:=nrel;
end;
end;
writeln(fo,nrcomp);
for i:=1 to nrcomp do
begin
for j:=1 to a[i,0] do
write(fo, a[i,j],' ');
writeln(fo);
end;
close(fi); close(Fo);
end.