#include <bits/stdc++.h>
using namespace std;
const int MAXN = 4e6 + 10;
const int INF = 1e9;
int color[MAXN], vis[MAXN], out[MAXN];
int pai[MAXN];
vector<pair<int, pair<int, int>>> adj[MAXN];
vector<int> nadj[MAXN];
bool cycle = false;
vector<int> ans;
int n, m;
void get_cycle(int u, int v){
while(v != u){
if(v < m) ans.push_back(v);
v = pai[v];
}
if(u < m) ans.push_back(u);
reverse(ans.begin(), ans.end());
}
void dfs(int v){
vis[v] = 1;
for(auto u : nadj[v]){
if(!vis[u]){
pai[u] = v;
dfs(u);
} else if(!out[u]){
if(!cycle) get_cycle(u, v);
cycle = true;
}
}
out[v] = 1;
}
void solve(){
cin >> n >> m;
cycle = false;
ans.clear();
for(int i=1; i<=n; i++) adj[i].clear();
for(int i=0; i<(3 * m); i++){
nadj[i].clear();
vis[i] = out[i] = 0;
}
for(int i=0; i<m; i++){
int a, b; cin >> a >> b >> color[i];
adj[a].push_back({color[i], {b, i}});
}
for(int i=1; i<=n; i++) sort(adj[i].begin(), adj[i].end());
for(int i=1; i<=n; i++){
int sz = (int) adj[i].size();
for(int k=1; k<sz; k++){
int e1 = adj[i][k].second.second, e2 = adj[i][k - 1].second.second;
nadj[e1 + m].push_back(e2 + m);
}
for(int k=0; k<(sz - 1); k++){
int e1 = adj[i][k].second.second, e2 = adj[i][k + 1].second.second;
nadj[e1 + 2 * m].push_back(e2 + 2 * m);
}
for(int k=0; k<sz; k++){
auto [j, e] = adj[i][k].second;
int c = adj[i][k].first;
nadj[e + m].push_back(e); nadj[e + 2 * m].push_back(e);
int pos_l = lower_bound(adj[j].begin(), adj[j].end(), make_pair(c, make_pair(0, 0))) - adj[j].begin() - 1;
int pos_r = upper_bound(adj[j].begin(), adj[j].end(), make_pair(c, make_pair(INF, INF))) - adj[j].begin();
if(pos_l >= 0) nadj[e].push_back(adj[j][pos_l].second.second + m);
if(pos_r < (int) adj[j].size()) nadj[e].push_back(adj[j][pos_r].second.second + 2 * m);
}
}
for(int i=0; i<(3 * m); i++) if(!vis[i]) dfs(i);
if(!cycle){
cout << "NO\n";
return;
}
cout << "YES\n";
cout << (int) ans.size() << " ";
for(auto i : ans) cout << i + 1 << " ";
cout << "\n";
}
int main(){
cin.tie(0)->sync_with_stdio(0);
int t; cin >> t;
while(t--){
solve();
}
return 0;
}