#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <string>
#include <iomanip>
#include <fstream>
#include <vector>
#include <deque>
#include <set>
#include <map>
#include <stack>
#include <queue>
#include <sstream>
using namespace std;
int T,t,m,n;
int dis[2005],vis[2005],head[2005],ans[2005];
struct edge {
int to,w,next;
} e[3005];
int addadge(int u,int v,int w) {
e[++t].to=v;
e[t].w=w;
e[t].next=head[u];
head[u]=t;
}
queue <int> q;
bool spfa()
{
dis[1]=0;
vis[1]=1;
q.push(1);
while(!q.empty())
{
int x=q.front();
q.pop();
vis[x]=0;
for(int i=head[x];i;i=e[i].next)
{
int y=e[i].to,z=e[i].w;
if(dis[y]>dis[x]+z)
{
dis[y]=dis[x]+z;
ans[y]=ans[x]+1;
if(ans[y]>=m)return true;
else if(vis[y]==0)
{
q.push(y);
vis[y]=1;
}
}
}
}
return false;
}
int main() {
scanf("%d",&T);
while(T--) {
scanf("%d%d",&n,&m);
memset(head,0,sizeof(head));
memset(dis,0x3f,sizeof(dis));
memset(vis,0,sizeof(vis));
memset(ans,0,sizeof(ans));
for(int i=0; i<=3005;i++) {
e[i].next=0;
e[i].to=0;
e[i].w=0;
}
t=0;
for(int i=1; i<=m; i++) {
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
addadge(u,v,w);
if(w>=0)addadge(v,u,w);
}
if(spfa())printf("YES\n");
else printf("NO\n");
}
return 0;
}