#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("ctc.in");
ofstream fout("ctc.out");
const int nmax=50000;
vector <int> g[nmax+5],gt[nmax+5];
vector <int> ctc[nmax+5];
int n,m,use[nmax+5],nrctc;
void read(){
fin>>n>>m;
for(int i=1;i<=m;++i){
int x,y;
fin>>x>>y;
g[x].push_back(y);
gt[y].push_back(x);
}
}
void dfsp(int nod){
use[nod]=1;
for(auto vecin:g[nod])
if(!use[vecin])
dfsp(vecin);
}
void dfsm(int nod){
use[nod]=2;
ctc[nrctc].push_back(nod);
//fout<<nod<<" ";
for(auto vecin:gt[nod])
if(use[vecin]==1)
dfsm(vecin);
}
void print(){
fout<<nrctc<<"\n";
for(int i=1;i<=nrctc;++i){
for(auto nod:ctc[i])
fout<<nod<<" ";
fout<<"\n";
}
}
int main()
{
read();
for(int i=1;i<=n;++i){
if(use[i]==0){
nrctc++;
dfsp(i);
dfsm(i);
//fout<<endl;
for(int i=1;i<=n;++i)
if(use[i]==1)
use[i]=0;
}
}
print();
return 0;
}