#include <bits/stdc++.h>
using namespace std;
ifstream in("ctc.in");
ofstream out("ctc.out");
vector<int> vn[100002], vt[100002], ans;
bool viz[100002];
stack<int> parcurgere;
void dfs (int v) {
viz[v] = true;
for (auto vec : vn[v]) {
if (!viz[vec]) {
dfs(vec);
}
}
parcurgere.push(v);
}
void dfst (int v) {
viz[v] = true;
for (auto vec : vt[v]) {
if (!viz[vec]) {
dfst(vec);
}
}
ans.push_back(v);
}
int main () {
int n, m;
in >> n >> m;
for (int i = 0; i < m; ++i) {
int a, b;
in >> a >> b;
vn[a].push_back(b);
vt[b].push_back(a);
}
for (int i = 1; i <= n; ++i) {
if (!viz[i]) {
dfs(i);
}
}
fill(viz, viz + n + 1, false);
vector<vector<int>> fans;
int C = 0;
while (!parcurgere.empty()) {
int nod = parcurgere.top();
parcurgere.pop();
if (!viz[nod]) {
dfst(nod);
fans.push_back(ans);
ans.clear();
C++;
}
}
out << C << '\n';
for (int i = 0; i < C; ++i) {
for (auto val : fans[i]) {
out << val << ' ';
}
out << '\n';
}
}