#include <bits/stdc++.h>
using namespace std;
ifstream fin("party.in");
ofstream fout("party.out");
int n, m;
int fixat[105];
vector<array<int, 3>> cer;
int nod(int x, int val) {
return 2 * (x - 1) + val;
}
void add(vector<vector<int>> &g, vector<vector<int>> >, int a, int b) {
g[a].push_back(b);
gt[b].push_back(a);
}
void clauza(vector<vector<int>> &g, vector<vector<int>> >, int a, int b) {
add(g, gt, a ^ 1, b);
add(g, gt, b ^ 1, a);
}
int ok() {
vector<vector<int>> g(2 * n), gt(2 * n);
for(auto it : cer) {
int x = it[0], y = it[1], z = it[2];
if(z == 0) {
clauza(g, gt, nod(x, 1), nod(y, 1));
} else if(z == 1) {
clauza(g, gt, nod(x, 1), nod(y, 0));
} else if(z == 2) {
clauza(g, gt, nod(x, 0), nod(y, 1));
} else {
clauza(g, gt, nod(x, 0), nod(y, 0));
}
}
for(int i = 1; i <= n; i++) {
if(fixat[i] == -1) {
continue;
}
int x = nod(i, fixat[i]);
clauza(g, gt, x, x);
}
vector<int> viz(2 * n), ord, comp(2 * n, -1);
function<void(int)> dfs1 = [&](int x) {
viz[x] = 1;
for(int y : g[x]) {
if(!viz[y]) {
dfs1(y);
}
}
ord.push_back(x);
};
function<void(int, int)> dfs2 = [&](int x, int c) {
comp[x] = c;
for(int y : gt[x]) {
if(comp[y] == -1) {
dfs2(y, c);
}
}
};
for(int i = 0; i < 2 * n; i++) {
if(!viz[i]) {
dfs1(i);
}
}
reverse(ord.begin(), ord.end());
int cnt = 0;
for(int x : ord) {
if(comp[x] == -1) {
dfs2(x, ++cnt);
}
}
for(int i = 1; i <= n; i++) {
if(comp[nod(i, 0)] == comp[nod(i, 1)]) {
return 0;
}
}
return 1;
}
int main() {
fin >> n >> m;
for(int i = 1; i <= m; i++) {
int x, y, z;
fin >> x >> y >> z;
cer.push_back({x, y, z});
}
for(int i = 1; i <= n; i++) {
fixat[i] = -1;
}
for(int i = 1; i <= n; i++) {
fixat[i] = 1;
if(!ok()) {
fixat[i] = 0;
}
}
vector<int> ans;
for(int i = 1; i <= n; i++) {
if(fixat[i]) {
ans.push_back(i);
}
}
fout << ans.size() << "\n";
for(int x : ans) {
fout << x << "\n";
}
return 0;
}