#include<queue>
#include<iostream>
#include<string.h>
using namespace std;
const int maxn=1e7+5;
const int INF=0x7f7f7f7f;
struct Edge{
int to,nxt,t;
};
Edge edge[maxn];
int head[maxn],cnt=0;
void add(int u,int v,int w){
edge[++cnt].to=v;
edge[cnt].t=w;
edge[cnt].nxt=head[u];
head[u]=cnt;
}
int dis[maxn];
bool bellman_ford(int n,int s){
dis[s]=0;
bool fl=false;
for(int i=1;i<=n;i++){
for(int u=1;u<=n;u++){
for(int j=head[u];j;j=edge[j].nxt){
int v=edge[j].to,w=edge[j].t;
if(w==INF)continue;
if(dis[v]<=dis[u]+w)continue;
dis[v]=dis[u]+w;
fl=true;
}
}
if(!fl)break;
}
return fl;
}
int vis[maxn];
bool spfa(int n,int s){
queue<int>que;
dis[s]=0,vis[s]=1;
que.push(s);
while(!que.empty()){
int u=que.front();
que.pop();
if(vis[u]==n)return false;
for(int i=head[u];i;i=edge[i].nxt){
int v=edge[i].to,w=edge[i].t;
if(w==INF)continue;
if(dis[v]<=dis[u]+w)continue;
dis[v]=dis[u]+w;
vis[v]++;
que.push(v);
}
}
return true;
}
void init(){
memset(edge,0,sizeof(edge));
memset(vis,0,sizeof(vis));
memset(dis,0,sizeof(dis));
memset(head,0,sizeof(head));
cnt=0;
}
int main(){
int t;
cin>>t;
while(t--){
int n,m;
cin>>n>>m;
init();
int a,b,c;
int i;
for(i=1;i<=n;i++)dis[i]=INF;
for(i=0;i<m;i++){
cin>>a>>b>>c;
add(a,b,c);
if(c>=0){
add(b,a,c);
}
}
if(spfa(n,1))cout<<"NO\n";
else cout<<"YES\n";
}
return 0;
}