#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <cmath>
#include <bitset>
#include <numeric>
#include <vector>
#include <list>
#include <string>
#include <algorithm>
#include <numeric>
#include <queue>
#include <set>
#include <map>
#include <stack>
#include <utility>
#include <unordered_map>
#include <tuple>
#define endl '\n'
#define LOG(a) cout<<a
using namespace std;
typedef long long LL;
LL t;
LL n, m;
LL cnt = 0;
// LL head[2010];
LL dist[2010];
struct edge {
LL s, to, val, next;
}edges[3010 * 2];
void add_edge(LL s, LL to, LL val) {
cnt++;
edges[cnt].s = s;
edges[cnt].to = to;
edges[cnt].val = val;
}
int main() {
cin>>t;
while (t--) {
cnt = 0;
memset(dist, 0x3f, sizeof dist);
cin >> n >> m;
for (LL i = 1;i <= m;i++) {
LL u, v, w;
cin >> u >> v >> w;
if (w >= 0) {
add_edge(u, v, w);
add_edge(v, u, w);
} else {
add_edge(u, v, w);
}
}
for (LL i = 1;i <= n - 1;i++) {
for (LL j = 1;j <= cnt;j++) {
if (dist[edges[j].to] > dist[edges[j].s] + edges[j].val) {
dist[edges[j].to] = dist[edges[j].s] + edges[j].val;
}
}
}
for (LL j = 1;j <= cnt;j++) {
if (dist[edges[j].to] > dist[edges[j].s] + edges[j].val) {
cout << "YES" << endl;
goto label1;
}
}
cout<<"NO"<<endl;
label1:;
}
return 0;
}
#12 输出的是YES,但是答案是NO,我看着输入的数据感觉存在负环,应该就要输出YES,感谢解答