#include<bits/stdc++.h>
using namespace std;
const int mx=1e4+10;
int cnt,c,n,m,s[mx],sum,tp,head[mx],low[mx],dfn[mx],be[mx];
bool co[mx],b[mx];
vector<int> ans[mx];
struct node{
int to,nxt;
}edge[100001];
void add(int u,int v){
edge[++cnt].to=v;
edge[cnt].nxt=head[u];
head[u]=cnt;
}
void dfs(int now){
dfn[now]=low[now]=++cnt;
s[++tp]=now,co[now]=1;
for(int i=head[now];i;i=edge[i].nxt){
int v=edge[i].to;
if(!dfn[v]){
dfs(v);
low[now]=min(low[now],low[v]);
}
else if(co[v]){
low[now]=min(low[now],low[v]);
}
}
if(dfn[now]==low[now]){
sum++;
while(s[tp]!=now){
co[s[tp]]=0;
be[s[tp]]=sum;
ans[sum].push_back(s[tp]);
tp--;
}
co[s[tp]]=0;
be[s[tp]]=sum;
ans[sum].push_back(s[tp]);
tp--;
}
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
int u,v;
cin>>u>>v;
add(u,v);
}
cnt=0;
for(int i=1;i<=n;i++)if(!dfn[i])dfs(i);
cout<<sum<<endl;
for(int i=1;i<=sum;i++)
sort(ans[i].begin(),ans[i].end());
for(int i=1;i<=n;i++){
if(b[be[i]])continue;
b[be[i]]=1;
for(int j=0;j<ans[be[i]].size();j++)
cout<<ans[be[i]][j]<<" ";
cout<<endl;
}
return 0;
}