#define PROBLEM "https://judge.yosupo.jp/problem/scc"
#include <bits/stdc++.h>
usingnamespacestd;#include "../graph/strongly_connected_components.cpp"
intmain(){intn,m;cin>>n>>m;StronglyConnectedComponentsscc(n);inta,b;for(inti=0;i<m;i++){cin>>a>>b;scc.add_edge(a,b);}scc.build(false);cout<<scc.N_scc<<'\n';for(inti=0;i<scc.N_scc;i++){cout<<(int)(scc.scc_group[i].size())<<' ';for(int&u:scc.scc_group[i]){cout<<u<<" ";}cout<<'\n';}return0;}
#line 1 "test/strongly_connected_components.test.cpp"
#define PROBLEM "https://judge.yosupo.jp/problem/scc"
#include <bits/stdc++.h>
usingnamespacestd;#line 3 "graph/strongly_connected_components.cpp"
usingnamespacestd;structStronglyConnectedComponents{private:std::vector<int>visited;std::vector<int>memo;void_dfs(intv){group[v]=-1;for(constint&u:G[v]){if(group[u]>0)_dfs(u);}order.push_back(v);}voidrdfs(intv,intcnt){group[v]=cnt;scc_group[cnt].push_back(v);for(constint&u:rG[v]){if(group[u]<0)rdfs(u,cnt);}}int_dp(intv){if(visited[v]>=0)returnmemo[v];intret=0;for(constint&u:sccG[v]){ret|=_dp(u);}visited[v]=1;returnmemo[v]=ret;}public:intN,N_scc;std::vector<std::vector<int>>G,rG;std::vector<int>group,order;std::vector<std::vector<int>>scc_group,sccG;// StronglyConnectedComponents receives N as the number of vertex of graph G.StronglyConnectedComponents(intN):N(N){G.resize(N);rG.resize(N);group.assign(N,1);}// add_edge receives a,b and creates edge a -> b.// contraint: 0 <= a,b < Nvoidadd_edge(inta,intb){G[a].push_back(b);rG[b].push_back(a);}// build bulids strongly connected components.// when build_scc is true, build scc_Gvoidbuild(boolbuild_scc){for(inti=0;i<N;i++){if(group[i]>0)_dfs(i);}std::reverse(order.begin(),order.end());N_scc=0;for(constint&v:order){if(group[v]<0){scc_group.push_back({});rdfs(v,N_scc);N_scc++;}}if(!build_scc)return;sccG.resize(N_scc);for(inti=0;i<N_scc;i++){std::set<int>st;for(constint&v:scc_group[i]){for(constint&u:G[v]){st.insert(group[u]);}}for(autoitr=st.begin();itr!=st.end();itr++){sccG[i].push_back(*itr);}}}// DP MUST BE IMPLEMENTED DEPENDING ON THE PROBLEM TO BE SOLVED.// build must be called before dp is called.intdp(){visited.assign(N_scc,-1);memo.resize(N_scc,0);for(inti=0;i<N_scc;i++){if((int)scc_group[i].size()>1){memo[i]=1;visited[i]=1;}}intans=0;for(inti=0;i<N_scc;i++){if(_dp(i))ans+=(int)scc_group[i].size();}returnans;}// scc[i] returns a group which vertex i belongs to.// this function is valid after build () is called.intoperator[](inti){returngroup[i];}};#line 5 "test/strongly_connected_components.test.cpp"
intmain(){intn,m;cin>>n>>m;StronglyConnectedComponentsscc(n);inta,b;for(inti=0;i<m;i++){cin>>a>>b;scc.add_edge(a,b);}scc.build(false);cout<<scc.N_scc<<'\n';for(inti=0;i<scc.N_scc;i++){cout<<(int)(scc.scc_group[i].size())<<' ';for(int&u:scc.scc_group[i]){cout<<u<<" ";}cout<<'\n';}return0;}