#include <bits/stdc++.h>
#include <iostream>
#include <vector>
#include <algorithm>
#include <numeric>
#include <cstdlib>
#include <cmath>
#include <queue>
#include <stack>
#include <deque>
#include <fstream>
#include <iterator>
#include <set>
#include <map>
#include <unordered_map>
#include <iomanip>
#include <cctype>
#include <string>
#include <cassert>
#include <set>
#include <bitset>
#include <unordered_set>
#include <numeric>
#define all(a) a.begin(), a.end()
#define fast ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
#define pb push_back
#define ppi pair<int,pair<int,int>>
#define int int64_t
using namespace std;
// /\_/\
// (= ._.)
// / > \>
// encouraging cat
const int INF = 10000000000000000;
//const int mod = 1000000007;
const int mod = 998244353;
const int MAXN = 10;
//ifstream fin('xor.in');
//ofstream fout('xor.out');
struct Edge {
int to, col, index;
};
vector<vector<Edge>> adj;
int vis[MAXN];
int curr_vis[MAXN][2];
int vis_col[MAXN];
vector<int> path, ans;
bool found = false;
bool stop = false;
pair<int,int> target = {-1, -1};
void dfs(int node, int col)
{
for (auto edge: adj[node])
{
if (found)
{
continue;
}
if (edge.col == col)
{
continue;
}
if ((curr_vis[edge.to][0] != -1 && curr_vis[edge.to][0] != edge.col) || (curr_vis[edge.to][1] != -1 && curr_vis[edge.to][1] != edge.col))
{
found = true;
stop = false;
target = {edge.to, edge.col};
ans.pb(edge.index);
continue;
}
if (vis[edge.to] == 2 || edge.col == vis_col[edge.to])
{
continue;
}
vis[edge.to]++;
vis_col[edge.to] = edge.col;
path.pb(edge.index);
int tp = 0;
if (curr_vis[node][tp] == -1)
{
curr_vis[node][tp] = edge.col;
}
else if (curr_vis[node][1] == -1)
{
curr_vis[node][1] = edge.col;
tp = 1;
}
dfs(edge.to, edge.col);
if (found && edge.to == target.first)
{
stop = true;
}
if (found && !stop)
{
ans.pb(path[path.size() - 1]);
}
curr_vis[node][tp] = -1;
path.pop_back();
}
}
signed main()
{
int t;
cin >> t;
for (int _ = 0;_ < t;_++)
{
int n,m;
cin >> n >> m;
adj.clear();
adj.resize(n);
vector<Edge> edges(m);
ans.clear();
path.clear();
target = {-1, -1};
found = false;
stop = false;
for (int i = 0;i < n;i++)
{
vis_col[i] = -1;
vis[i] = 0;
curr_vis[i][0] = -1;
curr_vis[i][1] = -1;
}
for (int i = 0;i < m;i++)
{
int u,v,c;
cin >> u >> v >> c;
u--,v--;
adj[u].pb({v, c, i + 1});
edges[i] = {v, c, i + 1};
}
for (int i = 0;i < n;i++)
{
if (vis[i] != 2)
{
dfs(i, -1);
}
}
//dfs(0, -1);
if (found)
{
cout << "YES" << '\n';
reverse(all(ans));
cout << ans.size() << " ";
for (auto i: ans)
{
cout << i << " ";
}
cout << '\n';
}
else
{
cout << "NO" << '\n';
}
}
return 0;
}