不用排序
#include<bits/stdc++.h>
using namespace std;
vector<int>scc[10005];
stack<int>a;
bool ins[100005];
int dfn[100005],low[100005],cnt,cnt1,tot,head[100005];
struct node{
int to,next;
}e[100005];
void add(int u,int v){
cnt1++;
e[cnt1].to=v;
e[cnt1].next=head[u];
head[u]=cnt1;
}
void tarjan(int u){
cnt++;
dfn[u]=low[u]=cnt;
a.push(u);
ins[u]=1;
for(int i=head[u];i;i=e[u].next){
int to=e[i].to;
if(!dfn[to]){
tarjan(to);
low[u]=min(low[u],low[to]);
}else if(ins[to]){
low[u]=min(low[u],dfn[to]);
}
}
if(dfn[u]==low[u]){
tot++;
int node;
do{
node=a.top();
a.pop();
ins[node]=0;
scc[tot].push_back(node);
}while(node!=u);
}
}
int n,m;
int u1,v1;
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>u1>>v1;
add(u1,v1);
}
tarjan(1);
for(int i=1;i<=tot;i++){
for(int j=0;j<scc[i].size();j++){
cout<<scc[i][j]<<" ";
}
cout<<endl;
}
}