#include<bits/stdc++.h>
using namespace std;
#define N 10003
int n,m,x,y,st[N],tp,sum,h[N];
int dfn[N],low[N],cnt,bl[N];
bool is[N],v[N];
vector<int>s[N];
struct edge{
int to,nxt;
}e[N*10];
void dfs(int x){
dfn[x]=low[x]=++cnt,st[++tp]=x,is[x]=1;
for(int i=h[x];i;i=e[i].nxt){
y=e[i].to;
if(!dfn[y]){
dfs(y);
low[x]=min(low[x],low[y]);
}else if(is[y])low[x]=min(low[x],dfn[y]);
}
if(dfn[x]==low[x]){
sum++;
do{
bl[st[tp]]=sum,is[st[tp]]=0;
s[sum].push_back(st[tp]);
}while(st[tp--]!=x);
}
}
int main(){
ios::sync_with_stdio(0);
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>x>>y;
e[i]={y,h[x]},h[x]=i;
}
for(int i=1;i<=n;i++){
if(!dfn[i])dfs(i);
}
for(int i=1;i<=sum;i++)sort(s[i].begin(),s[i].end());
cout<<sum;
for(int i=1;i<=n;i++){
if(v[bl[i]])continue;
v[bl[i]]=1;
cout<<'\n';
for(int j:s[bl[i]])cout<<j<<' ';
}
}