#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
vector<tuple<int,int,int>> adj[N];
int ui[N],vi[N],ci[N];
int ti,pi,st,fpi,fst;
bool fd=0;
vector<int> f[N];
map<int,int> vs[N],use[N];
map<int,pair<int,int>> pa[N];
void dfs(int u,int p,int pc,int ei){
if(fd) return;
//cout<<"visit" <<u <<"\n";
vs[u][pc]=1;
use[u][pc]=ei;
f[u].push_back(pc);
for(auto [v,c,id]:adj[u]){
if(c==pc) continue;
if(f[v].size()>=3){
continue;
}
if(vs[v][c]){
if(vs[v][c]==2) continue;
//cycle founded
fpi=v,fst=c;
fd=1,pi=u,st=pc;
use[v][c]=id;
return;
}
pa[v][c]={u,pc};
dfs(v,u,c,id);
if(fd) return;
}
vs[u][pc]=2;
}
void solve(){
fd=0;
int n,m; cin>>n >>m;
for(int i=0;i<m;i++){
cin>>ui[i] >>vi[i] >>ci[i];
adj[ui[i]].push_back({vi[i],ci[i],i+1});
}
for(int i=0;i<m;i++){
if(vs[vi[i]][ci[i]] || f[vi[i]].size()>=3) continue;
dfs(vi[i],ui[i],ci[i],i+1);
if(fd) break;
}
if(fd){
cout<<"YES\n";
vector<int> ans;
//cout<<tmp <<" " <<pi <<"\n";
ans.push_back(use[pi][st]);
while(pi!=fpi || st!=fst){
//cout<<pi <<" ";
auto [npi,nst]=pa[pi][st];
pi=npi,st=nst;
ans.push_back(use[pi][st]);
}
reverse(ans.begin(),ans.end());
cout<<ans.size() <<" ";
for(auto x:ans) cout<<x <<" ";
cout<<"\n";
}
else cout<<"NO\n";
for(int i=0;i<=n;i++) adj[i].clear(),vs[i].clear(),f[i].clear(),pa[i].clear(),use[i].clear();
}
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
int test; cin>>test;
while(test--){
solve();
}
}