#include <bits/stdc++.h>
using namespace std;
ifstream fin("ctc.in");
ofstream fout("ctc.out");
int n, m, x, y, stare[100005], ct=1;
vector<int> v[200005], sol, v2[200005], rez[100005];
bool vizit[100005];
void dfs(int nod) {
vizit[nod]=true;
for(auto u : v[nod]) {
if(vizit[u]==false) {
dfs(u);
}
}
sol.push_back(nod);
}
void dfs2(int nod) {
vizit[nod]=false;
for(auto u : v2[nod]) {
if(vizit[u]==true) {
dfs2(u);
}
}
rez[ct].push_back(nod);
}
int main()
{
fin >> n >> m;
for(int i=1; i<=m; i++) {
fin >> x >> y;
v[x].push_back(y);
v2[y].push_back(x);
}
for(int i=1; i<=n; i++) {
if(vizit[i]==false) {
dfs(i);
}
}
for(int i=n-1; i>=0; i--) {
if(vizit[sol[i]]==true) {
dfs2(sol[i]);
ct++;
}
}
fout << ct-1 << "\n";
for(int i=1; i<ct; i++) {
for(auto j : rez[i]) {
fout << j << " ";
}
fout << "\n";
}
return 0;
}