#include<iostream>
#include<cstdio>
#include<queue>
#define MAXN 20010
#define MAXM 60010
#define inf 1000007
using namespace std;
struct st
{
int to;
int dis;
int nxt;
}edge[MAXM];
int head[MAXN],size;
void add(int from,int to,int dis)
{
edge[++size].nxt=head[from];
edge[size].to=to;
edge[size].dis=dis;
head[from]=size;
}
int n,m,s=1;
int cnt[MAXN];
int c[MAXN];
bool b[MAXN];
int u,v,w;
void init()
{
scanf("%d%d",&n,&m);
for(int i=1;i<MAXN;i++)
head[i]=-1,cnt[i]=0,b[i]=0;
for(int i=1;i<MAXN;i++)
c[i]=inf;
for(int i=1;i<MAXM;i++)
edge[i].nxt=-1;
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&u,&v,&w);
add(u,v,w);
if(w>=0)
add(v,u,w);
}
}
bool spfa()
{
queue<int> q;
while(!q.empty())
q.pop();
c[s]=0;
b[s]=1;
q.push(s);
cnt[s]=1;
while(!q.empty())
{
u=q.front();
q.pop();
b[u]=0;
for(int i=head[u];~i;i=edge[i].nxt)
{
v=edge[i].to,w=edge[i].dis;
if(c[u]+w<c[v])
{
c[v]=c[u]+w;
cnt[v]=cnt[u]+1;
if(cnt[v]>n)
return 1;
if(!b[v])
{
q.push(v);
b[v]=1;
}
}
}
}
return 0;
}
int main()
{
int T;
cin>>T;
while(T--)
{
init();
if(spfa())
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
return 0;
}
评测记录