#12 WA 求调玄关
#include <bits/stdc++.h>
using namespace std;
bool f[100005];
int h[100005];
long long dist[100005];
//struct edge{
// int to,w,next;
//}e[200005];
vector< pair<int,int> > mp[114514];
int n,m,s,cnt=1,t;
//void add(int u,int v,int w)
////{
// e[cnt].to=v;
// e[cnt].w=w;
// e[cnt].next=h[u];
//
// h[u]=cnt++;
// return ;
//}
void mai()
{
int u,v,w;
cin >> n >> m;
for (int i=1;i<=n;i++)mp[i].clear();
//存图
for(int i=1;i<=m;i++)
{
cin >> u >> v >> w;
mp[u].push_back({v,w});
if (w>=0)
{
mp[v].push_back({u,w});
}
}
//if (n==4&&m==3&&t==1)
//{
// cout << "NO" << endl;
// return;
//}
//初始化源点s到各节点的最短路
memset(dist,0x3f3f3f3f,sizeof(dist));
//Bellman-Ford 算法
dist[1]=0;
for (int i=1;i<n;i++)
{
bool f=false;
for (int k=1;k<=n;k++)
{
for (int j=0;j<mp[k].size();j++)
{
if (dist[k]!=0x3f3f3f3f&&dist[mp[k][j].first]>dist[k]+mp[k][j].second)
{
dist[mp[k][j].first]=dist[k]+mp[k][j].second;
f=true;
//break;
}
}
}
if (!f)break;
}
bool flag=false;
for (int i=1;i<=n;i++)
{
for (int j=0;j<mp[i].size();j++)
{
if (dist[i]!=0x3f3f3f3f&&dist[mp[i][j].first]>dist[i]+mp[i][j].second)
{
flag=true;
break;
}
}
if (flag)break;
}
//for(int i=1;i<=n;i++){
// if(dist[i]>=0x3f3f3f)
// cout<<"2147483647"<<" ";
// else
// cout<<dist[i]<<" ";
//}
/*for (int j=1;j<=m;j++)
{
if (dist[e[j].to>dist[e[j].next]+e[j].w])
{
cout << "YES" << endl;
return 0;
}
}
cout << "NO" << endl;*/
if (flag)cout << "YES" << endl;
else cout << "NO" << endl;
return;
}
int main()
{
cin >> t;
for (int l=0;l<t;l++)
{
mai();
}
}