voidsolve() { int n, m; cin >> n >> m; vector<int> d(n + 1); vector<vector<int>> G(n + 1); vector<int> u(m + 1), v(m + 1), w(m + 1); for (int i = 1; i <= m; i++) { cin >> u[i] >> v[i] >> w[i]; if (w[i]) d[u[i]]++, d[v[i]]++; G[u[i]].push_back(i), G[v[i]].push_back(i); }
vector<bool> vis(n + 1); auto dfs = [&](auto dfs, int x) -> void { vis[x] = true; for (int i : G[x]) { int y = u[i] ^ v[i] ^ x; if (vis[y] || w[i] == 1) continue; dfs(dfs, y); if (d[y] & 1) { d[x]--, d[y]--; w[i] = 1; // 选 } } };
for (int i = 1; i <= n; i++) { if (!vis[i]) dfs(dfs, i); if (d[i] & 1) { cout << "NO\n"; return; } } cout << "YES\n";
vector<int> ans;
// 这种找欧拉回路T了 // auto dfs2 = [&](auto dfs2, int x) -> void { // for (int i : G[x]) { // if (w[i] == 0) continue; // int y = u[i] ^ v[i] ^ x; // w[i] = 0; // dfs2(dfs2, y); // } // ans.push_back(x); // };
auto dfs2 = [&](auto dfs2, int x) -> void { while (G[x].size()) { int i = G[x].back(); G[x].pop_back(); if (w[i] == 0) continue; int y = u[i] ^ v[i] ^ x; w[i] = 0; dfs2(dfs2, y); } ans.push_back(x); };
dfs2(dfs2, 1);
cout << ans.size() - 1 << endl; for (int i = 0; i < ans.size(); i++) { cout << ans[i] << " \n"[i == ans.size() - 1]; } }
intmain() { ios::sync_with_stdio(false), cin.tie(nullptr); int tt; cin >> tt; while (tt--) { solve(); } return0; }