#include <bits/stdc++.h>
#define pii pair<int, int>
#define ff first
#define ss second
#define int long long
#define pb push_back
// #define endl '\n'
using namespace std;
int n, m;
vector<vector<tuple<int, int, int>>> viz;
vector<int> marc;
vector<int> ordem;
vector<int> resp;
vector<int> bef;
bool dfs(int v, int ant, int i){
// if(v==vp&&ant!=prim){
// ordem.push_back(i);
// return 1;
// }
if(marc[i]==2)return 0;
if(marc[i]==1){
// cout << i << endl;
int at=bef[i];
while(at!=i){
// cout << at << endl;
resp.pb(at);
at=bef[at];
}
resp.pb(i);
// for(int j=ordem.size()-1; j>=0; j--){
// resp.pb(ordem[j]);
// if(ordem[j]==i)break;
// }
return 1;
}
// ordem.push_back(i);
marc[i]=1;
for(auto [u, w, id]:viz[v]){
if(w!=ant){
bef[id]=i;
if(dfs(u, w, id))return 1;
bef[id]=-1;
}
}
// ordem.pop_back();
marc[i]=2;
return 0;
}
void solve(){
cin >> n >> m;
// srand(time(0));
// n=1e6;
// m=2e5;
viz.assign(n, {});
bef.assign(m, -1);
resp={};
ordem={};
vector<int> arestas(m);
marc.assign(m, 0);
vector<int> pesos(m);
for(int i=0; i<m; i++){ // O(m)
int a, b, c;
cin>> a >> b >> c;
a--; b--;
// a=rand()%(n-1)+1;
// b=0;
// if(b==a){
// b++;
// b%=n;
// }
// c=rand()%m+1;
viz[a].pb({b, c, i});
pesos[i]=c;
arestas[i]=b;
}
for(int i=0; i<m; i++){
// marc.assign(m, 0);
if(marc[i]>=1)continue;
// ordem = {};
// at[]
if(dfs(arestas[i], pesos[i], i)){
cout << "YES"<<endl;
cout << resp.size()<<" ";
// reverse(resp.begin(), resp.end());
for(int j=resp.size()-1; j>=0; j--){
cout << resp[j]+1<<" ";
}
cout << endl;
return;
}
// cout << i <<endl;
}
cout << "NO"<<endl;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(NULL);
int t; cin >> t;
while(t--){
solve();
}
}