#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
int T,n,m,h[2005],nex[6005],av[6005],aw[6005],dis[2005],cnt,num[2005];
bool vis[2005];
void initialize(){
memset(h,0,sizeof(h));
memset(nex,0,sizeof(nex));
memset(av,0,sizeof(av));
memset(aw,0,sizeof(aw));
for(int i=1;i<=n;i++)dis[i]=0x7fffffff;
cnt=0;
memset(num,0,sizeof(num));
memset(vis,0,sizeof(vis));
return;
}
void add(int u,int v,int w){
av[++cnt]=v;
aw[cnt]=w;
nex[cnt]=h[u];
h[u]=cnt;
return;
}
bool SPFA(){
queue < int > q;
dis[1]=0;q.push(1);
while(!q.empty()){
int u=q.front();
q.pop();vis[u]=0;
for(int i=h[u];i;i=nex[i]){
if(dis[av[i]]>dis[u]+aw[i]){
dis[av[i]]=dis[u]+aw[i];
if(!vis[av[i]]){
q.push(av[i]);
num[av[i]]++;
if(num[av[i]]>n+1)return 1;
}
}
}
}
return 0;
}
int main(){
scanf("%d",&T);
for(int i=T;i;i--){
initialize();
scanf("%d%d",&n,&m);
for(int j=m;j;j--){
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
if(w>=0){
add(u,v,w);
add(v,u,w);
}
else{
add(u,v,w);
}
}
if(SPFA())printf("YES\n");
else printf("NO\n");
}
return 0;
}