#include<iostream>
#include<cstdlib>
#include<cstring>
#include<queue>
using namespace std;
const int Max=3e3+1;
queue<int> q;
int head[Max*2],edge[Max*2],ver[Max*2],Next[Max*2],tot,vis[Max*2];
int dis[Max*2],v[Max*2];
void add(int a,int b,int c){
edge[++tot]=c;ver[tot]=b;
Next[tot]=head[a];head[a]=tot;
if(c>=0){
edge[++tot]=c;ver[tot]=a;
Next[tot]=head[b];head[b]=tot;
}
}
bool spfa(int n){
while(!q.empty()){
q.pop();
}
q.push(1);
v[1]=1;
dis[1]=0;
while(q.size()){
int x=q.front();q.pop();
for(int i=head[x];i;i=Next[i]){
int y=ver[i];
if(edge[i]+dis[x]<dis[y]){
dis[y]=dis[x]+edge[i];
vis[y]=vis[x]+1;
if(vis[y]>=n){
return false;
}
if(!v[y]){
q.push(y);
v[y]=1;
}
}
}
}
return true;
}
void check(int n){
for(int i=1;i<=n;i++){
cout<<dis[i]<<" ";
}
for(int i=1;i<=n;i++){
cout<<vis[i]<<" ";
}
}
int main(){
int t;
cin>>t;
for(int i=1;i<=t;i++){
int n,m;
cin>>n>>m;
tot=0;
memset(head,0,sizeof(head));
memset(dis,0x3f,sizeof(dis));
memset(ver,0,sizeof(ver));
memset(edge,0,sizeof(edge));
memset(Next,0,sizeof(Next));
memset(vis,0,sizeof(vis));
memset(v,0,sizeof(v));
for(int j=1;j<=m;j++){
int a,b,c;
cin>>a>>b>>c;
add(a,b,c);
}
if(spfa(n)){
cout<<"NO"<<endl;
}else{
cout<<"YES"<<endl;
}
}
}