#include<bits/stdc++.h>
using namespace std;
#define maxn 5005
#define maxm 50005
int read(){
int x=0,f=1;char c=getchar();
while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+(c^'0');c=getchar();};
return x*f;
}
int n,m;
int dfn[maxn];
int low[maxn];
int vis[maxn];
int stack_[maxn],index_;
int sum,tag;
int color[maxn];
vector<int>g[maxn];
int max_size=-1;
priority_queue<int,vector<int>,greater<int> >ans_q;
void tarjan(int now){
dfn[now]=low[now]=++tag;
vis[now]=1;
stack_[++index_]=now;
for(int i=0;i<g[now].size();i++){
int to=g[now][i];
if(!dfn[to]){
tarjan(to);
low[now]=min(low[now],low[to]);
}else{
if(vis[to]){
low[now]=min(low[now],low[to]);
}
}
}
if(dfn[now]==low[now]){
sum++;
int sizes=0;
priority_queue<int,vector<int>,greater<int> >q;
while(1){
int stacktop=stack_[index_];
color[stacktop]=sum;
vis[now]=0;
sizes++;
q.push(stacktop);
index_--;
if(now==stack_[index_+1])break;
}
if(sizes>max_size||(sizes==max_size&&q.top()<ans_q.top())){
max_size=sizes;
while(!ans_q.empty())ans_q.pop();
while(!q.empty()){
ans_q.push(q.top());
q.pop();
}
}
}
}
int main(){
n=read();
m=read();
freopen("out.out","w",stdout);
for(int i=1,a,b,t;i<=m;i++){
a=read();
b=read();
t=read();
if(t==1)
g[a].push_back(b);
else{
g[a].push_back(b);
g[b].push_back(a);
}
}
for(int i=1;i<=n;i++){
if(!dfn[i])tarjan(i);
}
cout<<max_size<<'\n';
while(!ans_q.empty()){
cout<<ans_q.top()<<' ';
ans_q.pop();
}
return 0;
}