#include <bits/stdc++.h>
using namespace std;
ifstream fin("ctc.in");
ofstream fout("ctc.out");
int n, m;
vector<vector<int>> adj_list, adj_list_trans;
vector<int> visited, scc;
stack<int> out;
vector<vector<int>> ans;
void read()
{
fin >> n >> m;
adj_list.assign(n+1, {});
adj_list_trans.assign(n+1, {});
visited.assign(n+1, 0);
for(int i=0; i<m; i++)
{
int x, y;
fin >> x >> y;
adj_list[x].push_back(y);
adj_list_trans[y].push_back(x);
}
}
void dfs(int x)
{
visited[x] = 1;
for(auto &next:adj_list[x])
{
if(!visited[next])
dfs(next);
}
out.push(x);
}
void dfs_trans(int x)
{
visited[x] = 1;
scc.push_back(x);
for(auto &next:adj_list_trans[x])
{
if(!visited[next])
dfs_trans(next);
}
}
void kosaraju()
{
for(int i=1; i<=n; i++)
if(!visited[i])
dfs(i);
visited.assign(n+1, 0);
while(!out.empty())
{
int curr = out.top();
out.pop();
if(visited[curr])
continue;
dfs_trans(curr);
ans.push_back(scc);
scc.clear();
}
}
int main()
{
read();
kosaraju();
fout << ans.size() << '\n';
for(auto &scc : ans)
{
for(auto &x:scc)
fout << x << ' ';
fout << '\n';
}
return 0;
}