RT
#include<cstdio>
#include<stack>
using namespace std;
int n,m;
int t,u[50005],v[50005],now[5005],before[50005],dfn[5005],low[5005],time=0,color[5005],cnt[5005],sum=0,ans=0,k=0,maxn=0;
stack <int> st;
bool in[5005];
void tarjan(int x){
dfn[x]=low[x]=++time;
in[x]=true;
st.push(x);
for(int i=now[x];i!=-1;i=before[i]){
int y=v[i];
if(!dfn[y]){
tarjan(y);
low[x]=min(low[x],low[y]);
}
else if(in[y])
low[x]=min(low[x],dfn[y]);
}
if(dfn[x]==low[x]){
int temp=-1;
sum++;
while(temp!=x){
temp=st.top();
st.pop();
in[temp]=false;
color[temp]=sum;
cnt[sum]++;
}
}
return;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
now[i]=-1;
for(int i=1;i<=m;i++){
k++;
scanf("%d%d%d",&u[k],&v[k],&t);
before[k]=now[u[k]];
now[u[k]]=k;
if(t==2){
k++;
u[k]=v[k-1];
v[k]=u[k-1];
before[k]=now[u[k]];
now[u[k]]=k;
}
}
for(int i=1;i<=n;i++)
if(!dfn[i])
tarjan(i);
for(int i=1;i<=sum;i++)
if(cnt[i]>maxn){
maxn=cnt[i];
ans=i;
}
printf("%d\n",ans);
for(int i=1;i<=n;i++)
if(color[i]=ans)
printf("%d ",i);
return 0;
}
Tarjan应该没问题,边处理也没问题吧?