#include <iostream>
#include <fstream>
#include <bitset>
#include <vector>
#define nmax 100005
using namespace std;
int n, m, postOrder[nmax], x, y, nr, ctc;
vector <int> vecin[nmax], vec[nmax], sol[nmax];
bitset <nmax> viz;
void read()
{
ifstream fin("ctc.in");
fin >> n >> m;
for(int i = 1; i <= m; ++i){
fin >> x >> y;
vecin[x].push_back(y);
vec[y].push_back(x);
}
}
void dfs(int x)
{
viz[x] = 1;
for(int i = 0; i < vecin[x].size(); ++i)
if(!viz[vecin[x][i]]) dfs(vecin[x][i]);
postOrder[++nr] = x;
}
void dfst(int x)
{
viz[x] = 0;
sol[ctc].push_back(x);
for(int i = 0; i < vec[x].size(); ++i)
if(viz[vec[x][i]]) dfst(vec[x][i]);
}
void write()
{
ofstream fout("ctc.out");
fout << ctc << '\n';
for(int i = 1; i <= ctc; ++i){
for(int j = 0; j < sol[i].size(); ++j)
fout << sol[i][j] << ' ';
fout << '\n';
}
}
int main()
{
read();
for(int i = 1; i <= n; ++i)
if(!viz[i]) dfs(i);
for(int i = n; i >= 1; --i)
if(viz[postOrder[i]]) ctc++, dfst(postOrder[i]);
write();
return 0;
}