#include <bits/stdc++.h>
using namespace std;
const int MAXN = 2*3*1e6;
#define sz(v) (int)(v).size()
bool in[MAXN], vis[MAXN];
vector<int> adj[MAXN];
vector<int> adj_base[MAXN];
vector<pair<int, int>> eds;
vector<pair<int, int>> pref[MAXN], suf[MAXN];
vector<int> ans;
int m;
bool cmp(int e1, int e2) {
return get<1> (eds[e1]) < get<1> (eds[e2]);
}
bool dfs(int v) {
vis[v] = true; in[v] = true;
for (int viz : adj[v]) {
if (in[viz]) {
if (v < m) {
ans.push_back(v);
}
return true;
}
if (vis[viz]) continue;
if (dfs(viz)) {
if (v < m) {
ans.push_back(v);
}
return true;
}
}
in[v] = false;
return false;
}
int main() {
cin.tie(0)->sync_with_stdio(false);
int tt; cin >> tt;
while (tt--) {
int n; cin >> n >> m;
int pt = 0;
for (int i=0; i<m; i++) {
int a, b, t; cin >> a >> b >> t; a--; b--;
adj_base[a].push_back(pt++);
eds.emplace_back(a ^ b, t);
}
for (int v=0; v<n; v++) {
sort(adj_base[v].begin(), adj_base[v].end(), cmp);
for (int j=0; j<sz(adj_base[v]); j++) {
adj[pt].push_back(adj_base[v][j]);
cerr << "conexão pref: " << pt << " -> " << adj_base[v][j] << '\n';
if (j != sz(adj_base[v])-1) {
cerr << "entre pref: " << pt << " -> " << pt+1 << '\n';
adj[pt].push_back(pt+1);
}
pref[v].emplace_back(get<1> (eds[adj_base[v][j]]), pt++);
}
for (int j=sz(adj_base[v])-1; j>=0; j--) {
adj[pt].push_back(adj_base[v][j]);
cerr << "conexão suf: " << pt << " -> " << adj_base[v][j] << '\n';
if (j != 0) {
adj[pt].push_back(pt+1);
cerr << "entre suf: " << pt << " -> " << pt+1 << '\n';
}
suf[v].emplace_back(get<1> (eds[adj_base[v][j]]), pt++);
}
reverse(suf[v].begin(), suf[v].end());
}
for (int v=0; v<n; v++) {
for (int ed : adj_base[v]) {
auto [comb, t] = eds[ed];
int viz = comb ^ v;
auto it = upper_bound(pref[viz].begin(), pref[viz].end(), make_pair(t, 1000000000));
if (it != pref[viz].end()) {
adj[ed].push_back(it->second);
cerr << "para pref: " << ed << " -> " << it->second << '\n';
}
it = lower_bound(suf[viz].begin(), suf[viz].end(), make_pair(t, -1));
if (it != suf[viz].begin()) {
it--;
adj[ed].push_back(it->second);
cerr << "para suf: " << ed << " -> " << it->second << '\n';
}
}
}
bool can = false;
for (int i=0; i<m; i++) {
if (vis[i]) continue;
if (dfs(i)) {
can = true;
break;
}
}
if (!can) cout << "NO\n";
else {
cout << "YES\n";
cout << sz(ans) << '\n';
for (int v : ans) cout << v+1 << ' ';
cout << '\n';
}
for (int i=0; i<pt; i++) {
vis[i] = false;
adj[i].clear();
}
for (int i=0; i<m; i++) {
adj_base[i].clear();
}
for (int i=0; i<n; i++) {
pref[i].clear(); suf[i].clear();
}
eds.clear();
ans.clear();
pt = 0;
}
return 0;
}