#include<bits/stdc++.h>
#define int long long
using namespace std;
int t;
int s;
int n,m;
//要判断入队次数而不是松弛次数(重边)
const int maxn=2e3+5;
const int inf=0x7fffffff;
const int maxm=3e3+5;
int dis[maxn];
int vis[maxn];
int head[maxn];
struct node{
int to,nxt,w;
}p[maxm<<1];
int cntt;
int cnt[maxn];
void add(int x,int y,int z){
p[++cntt].to=y;
p[cntt].nxt=head[x];
p[cntt].w=z;
head[x]=cntt;
}
void spfa(){
queue<int>q;e
for(int i=1;i<=n;i++){
dis[i]=inf;
vis[i]=0;
cnt[i]=0;
}
q.push(1);
dis[1]=0;
cnt[1]++;
vis[1]=1;//出入队标记
while(!q.empty()){
int a=q.front();
q.pop();
vis[a]=0;
for(int i=head[a];i;i=p[i].nxt){
int v=p[i].to;
if(dis[v]>dis[a]+p[i].w){
dis[v]=dis[a]+p[i].w;
if(!vis[v]){
cnt[v]++;
if(cnt[v]>=n){
cout<<"YES"<<endl;
return;
}
q.push(v);
vis[v]=1;
}
}
}
}
cout<<"NO"<<endl;
}
signed main(){
ios::sync_with_stdio(false);
int t;
int n,m;
cin>>t;
while(t--){
cntt=0;
memset(head,0,sizeof(head));
//memset(p,0,sizeof(p));//
cin>>n>>m;
for(int i=1;i<=m;i++){
int aa,bb,cc;
cin>>aa>>bb>>cc;
if(cc>=0){
add(aa,bb,cc);
add(bb,aa,cc);
continue;
}
add(aa,bb,cc);
}
spfa();
}
return 0;
}