#include <bits/stdc++.h>
using namespace std;
const int MAXN=2005;
const int MAXM=3005;
int T,n,m;
int num[MAXN],dis[MAXN];
bool vis[MAXN];
struct edge{
int to,w;
};
vector <edge> g[MAXM*2];
int main(){
scanf("%d",&T);
while(T--){
bool f=0;
memset(num,0,sizeof(num));
memset(vis,0,sizeof(vis));
fill(dis+1,dis+n+1,0x3f3f3f3f);
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)g[i].clear();
for(int i=1;i<=m;i++){
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
if(w>=0){
g[u].push_back({v,w});
g[v].push_back({u,w});
}
else g[u].push_back({v,w});
}
queue <int> q;
q.push(1);
dis[1]=0;
vis[1]=1;
num[1]++;
while(!q.empty()){
int u=q.front();
q.pop();
vis[u]=0;
for(int i=0;i<g[u].size();i++){
int v=g[u][i].to;
if(dis[v]>dis[u]+g[u][i].w){
dis[v]=dis[u]+g[u][i].w;
if(!vis[v]){
vis[v]=1;
q.push(v);
num[v]++;
if(num[v]>=n){
printf("YES\n");
f=1;
break;
}
}
if(f)break;
}
}
if(f)break;
}
if(!f)printf("NO\n");
}
return 0;
}