//top++
//强连通分量的数组要和点的数组一样大
#include<cstdio>
#include<iostream>
#include<vector>
using namespace std;
const int maxn = 5050;
vector<int> g[5050];
int low[maxn], stack[maxn], instack[maxn], dfn[maxn], sum[maxn], belong[maxn];
int bcnt, top, index, ans, mark;
void in(int a, int b){
g[a].push_back(b);
}
void tarjan(int u){
stack[top++] = u;
instack[u] = 1;
dfn[u] = low[u] = ++index;
for(int i = 0; i < g[u].size(); i++){
int v = g[u][i];
if(!dfn[v]){//没访问过
tarjan(v);
low[u] = min(low[u], low[v]);
}
else if(instack[v])//访问过且在栈内
low[u] = min(low[u], dfn[v]);
}
if(low[u] == dfn[u]){
int v;
bcnt++;
while(u != v){
v = stack[--top];
belong[v] = bcnt;
instack[v] = 0;
sum[bcnt]++;
}
}
}
int main(){
int n, m;
cin >> n >> m;
for(int i = 1, a, b, y; i <= m; i++){
cin >> a >> b >> y;
in(a, b);
if(y == 2) in(b, a);
}
for(int i = 1; i <= n; i++)
if(!dfn[i]) tarjan(i);
for(int i = 1; i <= n; i++){//通过从小到大遍历找到最大的字典序最小的强连通分量
if(sum[belong[i]] > ans){
ans = sum[belong[i]];
mark = i;
}
}
cout << ans << endl;
for(int i = 1; i <= n; i++){
//cout << belong[i] << "/ ";
if(belong[i] == belong[mark])
cout << i << " ";
}
cout << endl;
return 0;
}
09-19