#include <bits/stdc++.h>
using namespace std;
const int nmax=1e5+5;
ifstream f("ctc.in");
ofstream g("ctc.out");
vector<int>adj[nmax];
vector<int> adjt[nmax];
stack <int> s;
bool v[nmax];
vector <int> ans[nmax];
void dfs1 (int x)
{
v[x]=1;
for(auto it: adj[x])
{
if(!v[it])
{dfs1(it);
}
}
s.push(x);
}
void dfs2(int x,int k)
{
v[x]=1;
ans[k].push_back(x);
for(auto it : adjt[x])
if(!v[it])
dfs2(it,k);
}
int main ()
{
int n,m;
f>>n>>m;
while(m--)
{ int x,y;
f>>x>>y;
adj[x].push_back(y);
adjt[y].push_back(x);
}
for(int i=1;i<=n;i++)
dfs1(i);
for(int i=1;i<=n;i++)
v[i]=0;
int k=1;
while(!s.empty())
{
int nod =s.top();
s.pop();
if(!v[nod])
{
dfs2(nod,k);
k++;
}
}
g<<k-1;
for(int i=1;i<k;i++)
{
g<<'\n';
for(auto it : ans[i])
g<<it<<' ';
}
}