#include <bits/stdc++.h>
using namespace std;
#define fi first
#define sc second
#define sz(v) (int)v.size()
const int MAXN = 1e6+5;
vector< int > adj[MAXN], ans;
int marc[MAXN], viz[MAXN], cor[MAXN], qtd[MAXN], fim;
bool dfs(int a){
if(qtd[viz[a]] >= 5)return false;
marc[a] = 1;
for(int& id : adj[ viz[a] ]){
if(cor[id] == cor[a])continue;
if(marc[id] == 1){
ans.push_back(id);
fim = id;
return true;
}
if(marc[id] == 2)continue;
bool b = dfs(id);
if(b){
if(fim == id)fim = 0;
if(fim > 0)ans.push_back(id);
return true;
}
}
marc[a] = 2;
return false;
}
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
int t; cin>>t;
while(t--){
int n,m; cin>>n>>m;
for(int i = 1; i <= m; i++){
int a; cin>>a>>viz[i]>>cor[i];
adj[a].push_back(i);
}
for(int i = 1; i <= m; i++)
if(!marc[i] && dfs(i))break;
if(sz(ans) > 0){
cout<<"YES\n";
cout<<sz(ans)<<" ";
for(int i = sz(ans)-1; i >= 0; i--)cout<<ans[i]<<" ";
cout<<"\n";
}else cout<<"NO\n";
ans.clear();
for(int i = 1; i <= n; i++){
adj[i].clear();
qtd[i] = 0;
}
for(int i = 1; i <= m; i++)marc[i] = 0;
}
}