题目
记录
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define re read()
inline int read(){
int x=0,b=1;char c=getchar();
while(!isdigit(c)){if(c=='-') b=-1;c=getchar();}
while(isdigit(c)){x=x*10+c-'0';c=getchar();}
return x*b;
}
const int N=500007,M=2000007;
int n,m,head[N],cnt;
struct node {
int to,nex;
}edge[M*2];
void add(int x,int y){
edge[cnt].to=y;
edge[cnt].nex=head[x];
head[x]=cnt++;
}
int p[M*2];
int dfn[N],low[N],tim,num;
vector<int > ans[N];
stack<int > Stack;
void tarjan(int x,int fa){
dfn[x]=low[x]=++tim;
Stack.push(x);
for(int i=head[x];i;i=edge[i].nex){
int y=edge[i].to;
if(!dfn[y]){
tarjan(y,i);
low[x]=min(low[x],low[y]);
if(dfn[x]<low[y])
p[i]=p[i^1]=1;
}
else if(i!=(fa^1))
low[x]=min(low[x],dfn[y]);
}
if(low[x]==dfn[x]){
++num;
int now;
do
{
now=Stack.top();
ans[num].push_back(now);
Stack.pop();
}
while(now!=x);
}
}
signed main(){
n=re;m=re;
for(int i=1;i<=m;++i){
int u,v;
u=re;v=re;
if(u==v) continue;
add(u,v);add(v,u);
}
for(int i=1;i<=n;++i)
if(!dfn[i]) tarjan(i,0);
cout<<num<<endl;
for(int i=1;i<=num;++i) {
cout<<ans[num].size()<<' ';
for(auto j:ans[i]) cout<<j<<' ';
cout<<"\n";
}
return 0;
}