#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5;
const int maxm = 1e5;
struct edge
{
int to, next, dis;
};
edge edges[maxm];
int index = 0, head[maxn], dis[maxn], cnt[maxn];
bool vis[maxn];
void add_edge(int u, int v, int dis)
{
index++;
edges[index].to = v;
edges[index].dis = dis;
edges[index].next = head[u];
head[u] = index;
}
void SPFA(int n)
{
queue<int> q;
q.push(1);
vis[1] = true;
cnt[1]++;
dis[1] = 0;
while (!q.empty())
{
int t = q.front();
q.pop();
vis[t] = false;
for (int i = head[t]; i; i = edges[i].next)
{
int y = edges[i].to;
int dis_t_y = edges[i].dis;
if (dis[y] > dis[t] + dis_t_y)
{
dis[y] = dis[t] + dis_t_y;
if (vis[y] == false)
{
cnt[y]++;
if (cnt[y] >= n)
{
cout << "YES" << endl;
return;
}
q.push(y);
vis[y] = true;
}
}
}
}
cout << "NO" << endl;
}
int main()
{
int T;
cin >> T;
while (T--)
{
int n, m;
cin >> n >> m;
for (int i = 0; i <= n; i++)
dis[i] = INT_MAX;
index = 0;
memset(cnt, 0, sizeof(cnt));
memset(vis, 0, sizeof(vis));
memset(edges, 0, sizeof(edges));
memset(head, 0, sizeof(head));
int u, v, w;
for (int i = 1; i <= m; i++)
{
cin >> u >> v >> w;
add_edge(u, v, w);
if (w >= 0)
add_edge(v, u, w);
}
SPFA(n);
}
return 0;
}