用的这码
#include<bits/stdc++.h>
using namespace std;
const int N=5e5+5,M=2e6+5;
int he[N],ver[M*2],ne[M*2];
int dfn[N],low[N],ed[N];
int n,m,t=1,id,edc;
bool br[N*2];
vector<int>ans[N*2];
void add(int x,int y)
{
ver[++t]=y;
ne[t]=he[x];
he[x]=t;
}
void tarjan(int u,int from)
{
dfn[u]=low[u]=++id;
for(int i=he[u]; i; i=ne[i])
{
int v=ver[i];
if(!dfn[v])
{
tarjan(v,i);
low[u]=min(low[u],low[v]);
if(low[v]>dfn[u])br[i]=br[i^1]=1;
}
else if(i!=(from^1))low[u]=min(low[u],dfn[v]);
}
}
void dfs(int u)
{
ed[u]=edc;
if(u)ans[edc].push_back(u);
for(int i=he[u]; i; i=ne[i])
{
int v=ver[i];
if(ed[v]||br[i])continue;
dfs(v);
}
}
signed main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
cin>>n>>m;
for(int i=1; i<=m; i++)
{
int x,y;
cin>>x>>y;
add(x,y);
add(y,x);
}
for(int i=1; i<=n; i++)
if(!dfn[i])tarjan(i,0);
for(int i=1; i<=n; i++)
if(!ed[i])
{
edc++;
dfs(i);
}
cout<<edc<<'\n';
for(int i=1; i<=edc; i++)
{
cout<<ans[i].size();
for(int j=0; j<ans[i].size(); j++)
cout<<' '<<ans[i][j];
cout<<'\n';
}
return 0;
}