#include <bits/stdc++.h>
using namespace std;
//#define int long long
#define endl '\n'
#define pb push_back
const int N=1e6+5,MAXA=1e6+5,inf=2e9+5,MOD=982451653;
vector<int> adj[N*4];
vector<pair<int,int>> out[N],in[N];
int id[N*4],st[N],vv,offset[N];
void build(int node,int offsett){
if(node>=offsett)return;
adj[id[node]].pb(id[node*2]);
adj[id[node]].pb(id[node*2+1]);
build(node*2,offsett);
build(node*2+1,offsett);
}
void query(int node,int qlo,int qhi,int lo,int hi,int u,int plus){
if(qlo>qhi)return;
if(lo>=qlo && hi<=qhi){
// if(plus==6)cout<<lo<<' '<<hi<<' '<<out[vv][node-offset[vv]].second<<endl;
if(lo!=hi)adj[u].pb(node+plus);
else adj[u].pb(out[vv][node-offset[vv]].second);
return;
}
if(lo>qhi || hi<qlo)return;
int mid=(lo+hi)/2;
query(node*2,qlo,qhi,lo,mid,u,plus);
query(node*2+1,qlo,qhi,mid+1,hi,u,plus);
}
int vis[N*4],goal=-1;
bool stop=0;
vector<int> ans;
void dfs(int node){
vis[node]=1;
if(stop)return;
for(auto i:adj[node]){
if(vis[i]==1){
goal=i;
ans.pb(node);
return;
}
if(vis[i]==0){
dfs(i);
if(stop)return;
if(goal!=-1){
ans.pb(node);
if(goal==node)stop=1;
return;
}
}
}
vis[node]=2;
}
signed main(){
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
int t; cin>>t;
while(t--){
int n,m; cin>>n>>m;
ans.clear(); goal=-1; stop=0;
for(int i=1;i<=n;i++){
in[i].clear(); out[i].clear(); adj[i].clear();
}
for(int i=1;i<=m*4;i++)adj[i].clear();
pair<int,int> p[m];
int a[m];
for(int i=0;i<m;i++){
int c,u,v; cin>>u>>v>>c;
p[i]={u,v}; a[i]=c;
out[u].pb({c,i+1}); in[v].pb({c,i+1});
}
int dummy=m+1;
for(int i=1;i<=n;i++){
sort(out[i].begin(),out[i].end());
offset[i]=1;
while(offset[i]<out[i].size())offset[i]*=2;
st[i]=dummy;
for(int j=1;j<offset[i];j++)id[j]=dummy++;
for(int j=offset[i];j<offset[i]+out[i].size();j++)id[j]=out[i][j-offset[i]].second;
for(int j=offset[i]+out[i].size();j<offset[i]*2;j++)id[j]=dummy++;
build(1,offset[i]);
}
// cout<<adj[7][0]<<' '<<adj[7][1]<<endl;
for(int i=0;i<dummy;i++)vis[i]=0;
for(int i=0;i<m;i++){
int c=a[i],v=p[i].second;
vv=v;
int first=lower_bound(out[v].begin(),out[v].end(),make_pair(c,-1))-out[v].begin();
int last=upper_bound(out[v].begin(),out[v].end(),make_pair(c,inf))-out[v].begin();
last--;
if(first<out[v].size() && out[v][first].first==c){
if(out[v].size()==1)continue;
else{
// cout<<i+1<<' '<<first<<' '<<last<<' '<<out[v][0].first<<' '<<out[v][1].first<<' '<<st[v]<<endl;
query(1,0,first-1,0,offset[v]-1,i+1,st[v]-1);
query(1,last+1,(int)out[v].size()-1,0,offset[v]-1,i+1,st[v]-1);
}
}
else{
// cout<<i+1<<' '<<v<<' '<<out[v][0].second<<endl;
if(out[v].size()==1)adj[i+1].pb(out[v][0].second);
else if(out[v].size())query(1,0,(int)out[v].size()-1,0,offset[v]-1,i+1,st[v]-1);
}
}
for(int i=1;i<=m;i++){
if(!vis[i])dfs(i);
if(ans.size())break;
}
if(ans.size()){
cout<<"YES"<<endl;
vector<int> real;
for(int i=0;i<ans.size();i++){
// cout<<ans[i]<<' ';
if(ans[i]<=m)real.pb(ans[i]);
}
// cout<<endl;
cout<<real.size()<<' '<<real[0]<<' ';
for(int i=real.size()-1;i>0;i--)cout<<real[i]<<' ';
cout<<endl;
}
else cout<<"NO"<<endl;
}
}