#include <bits/stdc++.h>
using namespace std;
bool to[5005][5005];
priority_queue <int, vector <int>, greater <int> > ans[5005];
bool vis[5005];
stack <int> s;
bool ins[5005];
int df[5005], lw[5005];
int it, n;
void trj(int i)
{
df[i] = lw[i] = ++it;
s.push(i);
ins[i] = 1;
for (int j = 1; j <= n; j++)
if (to[i][j] && ! vis[j])
if (ins[j])
lw[i] = min(lw[i], lw[j]);
else
trj(j),
lw[i] = min(lw[i], lw[j]);
if (df[i] == lw[i])
{
while (s.top() != i)
ins[s.top()] = 0,
ans[i].push(s.top()),
s.pop();
ins[i] = 0;
s.pop();
ans[i].push(i);
}
vis[i] = 1;
}
int main()
{
int m;
cin >> n >> m;
int op, u, v;
while (m--)
cin >> u >> v >> op,
to[u][v] = 1,
to[v][u] |= (op == 2);
for (int i = 1; i <= n; i++)
if (! vis[i])
trj(i);
int mx = 0;
int mxi;
for (int i = 1; i <= n; i++)
if (mx < ans[i].size())
mx = ans[i].size(),
mxi = i;
cout << mx << endl;
while (! ans[mxi].empty())
cout << ans[mxi].top() << " ",
ans[mxi].pop();
cout << endl;
return 0;
}