#include<bits/stdc++.h>
using namespace std;
const int maxN=1e4+5,maxM=1e5+5;
struct edge{
int to;
int nxt;
}e[maxM];
int head[maxN],cnt;
void addEdge(int u ,int v){
e[++cnt].to=v;
e[cnt].nxt=head[u];
head[u]=cnt;
}
int dfn[maxN],low[maxN],timestamp;
stack<int> sta;
int popRound[maxN],roundID;
void tarjan(int u){
dfn[u]=low[u]=++timestamp;
sta.push(u);
for(int id=head[u];id;id=e[id].nxt){
int v=e[id].to;
if(0==dfn[v]){
tarjan(v);
low[u]=min(low[u],low[v]);
}
else if(0==popRound[v])
low[u]=min(low[u],low[v]);
}
if(dfn[u]==low[u]){
popRound[u]=++roundID;
while(sta.top()!=u){
popRound[sta.top()]==roundID;
sta.pop();
}
sta.pop();
}
}
bool output[maxN];
int main(){
int n,m;
cin>>n>>m;
int u,v;
for(int i=1;i<=m;i++){
cin>>u>>v;
addEdge(u,v);
}
for(int i=1;i<=n;i++){
if(0==dfn[i])
tarjan(i);
}
cout<<roundID<<endl;
for(int i=1;i<=n;i++){
if(output[i])
continue;
cout<<i<<' ';
output[i]=true;
for(int j=i+1;j<=n;j++)
if(popRound[j]==popRound[i]){
cout<<j<<" ";
output[j]=true;
}
cout<<endl;
}
return 0;
}
救救孩子吧