#include <bits/stdc++.h>
using namespace std;
ifstream fin("ctc.in");
ofstream fout("ctc.out");
int n, m, global_idx;
vector<vector<int>> adj_list, ans;
vector<int> cc, idx, lowlink, visited, in_stack;
stack<int> S;
void read()
{
fin>>n>>m;
adj_list.assign(n+1, vector<int>());
idx.assign(n+1, -1);
lowlink.assign(n+1, 0);
in_stack.assign(n+1, 0);
for(int i=0; i<m; i++)
{
int x, y;
fin>>x>>y;
adj_list[x].push_back(y);
}
}
void dfs(int x)
{
idx[x] = lowlink[x] = global_idx++;
S.push(x);
in_stack[x] = 1;
for(auto &next:adj_list[x])
{
if(idx[next] == -1)
{
dfs(next);
lowlink[x] = min(lowlink[x], lowlink[next]); //update low
}
else if(in_stack[next])
lowlink[x] = min(lowlink[x], lowlink[next]); //update low
}
// out
if(idx[x] == lowlink[x]) //head of scc
{
cc.clear();
int y = S.top();
S.pop(); in_stack[y] = 0;
cc.push_back(y);
while(y != x)
{
y = S.top();
S.pop(); in_stack[y] = 0;
cc.push_back(y);
}
ans.push_back(cc);
}
}
int main()
{
read();
for(int i=1; i<=n; i++)
if(idx[i] == -1)
dfs(i);
fout<<ans.size()<<'\n';
for(auto &cc:ans)
{
for(auto &x:cc)
fout<<x<<' ';
fout<<'\n';
}
return 0;
}