rt
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <queue>
using namespace std;
const int maxsize = 210000;
int head[maxsize];
struct Edge
{
int next;
int to;
int val;
}edge[maxsize * 2];
int c_edge;
void AddEdge(int u,int v,int val)
{
edge[++c_edge].next = head[u];
edge[c_edge].to = v;
edge[c_edge].val = val;
head[u] = c_edge;
}
int n,m;
queue<int> q,CLS;
bool in[maxsize];
int dist[maxsize];
int cnt[maxsize];
bool SPFA()
{
memset(dist,0x3f,sizeof(dist));
memset(in,0,sizeof(in));
memset(cnt,0,sizeof(cnt));
q = CLS;
q.push(1);
dist[1] = 0;
in[1] = 1;
cnt[1]++;
while(!q.empty())
{
int pos = q.front();
q.pop();
in[pos] = 0;
for(int i = head[pos];i;i = edge[i].next)
{
int to = edge[i].to;
if(dist[to] > dist[pos] + edge[i].val)
{
dist[to] = dist[pos] + edge[i].val;
if(++cnt[to] > n)
return 1;
if(!in[to])
{
in[to] = 1;
q.push(to);
}
}
}
}
return 0;
}
int main()
{
int t = 0;
scanf("%d",&t);
while(t--)
{
memset(head,0,sizeof(head));
memset(edge,0,sizeof(edge));
c_edge = 0;
scanf("%d%d",&n,&m);
for(int i = 1;i <= m;i++)
{
int u = 0,v = 0,val = 0;
scanf("%d%d%d",&u,&v,&val);
AddEdge(u,v,val);
if(val >= 0)
AddEdge(v,u,val);
}
if(SPFA())
puts("YES");
else
puts("NO");
}
}