#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6+5;
int n , m , cnt = 0 , head[maxn] , dis[maxn] , tot[maxn];
bool vis[maxn];
struct edge
{
int u , v , w , next;
}e[maxn];
void Insert(int u , int v , int w)
{
e[++cnt].u=u , e[cnt].v=v , e[cnt].w=w , e[cnt].next=head[u] , head[u]=cnt;
}
void SPFA(int s)
{
memset(dis , 0x3f , sizeof(dis));
memset(vis , 0 , sizeof(vis));
memset(tot , 0 , sizeof(tot));
queue<int>q;
q.push(s);
vis[s]=1;
dis[s]=0;
tot[s]=0;
while(q.size())
{
int u = q.front();
//cout << u << endl;
q.pop();
vis[u]=0;
for (int i = head[u]; i; i = e[i].next)
{
int v = e[i].v , w = e[i].w;
if (dis[v] > dis[u] + w)
{
//cout << 1;
dis[v]=dis[u] + w;
if (!vis[v])
{
if (++tot[v] >= n)
{
cout << "YES\n";
return;
}
q.push(v);
vis[v]=1;
}
}
}
}
cout << "NO\n";
return;
}
int main ()
{
int t;
scanf("%d", &t);
while(t--)
{
scanf("%d%d" , &n , &m);
//cout << n << " " << m << endl;
for (int i = 1; i <= m; i++)
{
int u , v , w;
scanf("%d%d%d" , &u , &v , &w);
if (w >= 0) Insert(u , v , w) , Insert(v , u , w);
else Insert(u , v , w);
}
SPFA(1);
}
return 0;
}
应该没问题的啊