#include <cstdio>
#include <cstring>
int t, n, m, dis[2001];
struct Edge {
int start, to, w, nxt;
} eg[6001];
int head[2001], ptr;
inline int min(int a, int b) {return (a < b ? a : b);}
bool bellman() {
memset(dis, 0x7f, sizeof dis);
dis[1] = 0;
for (int i = 1; i < n; ++i)
for (int j = 1; j <= ptr; ++j)
if (dis[eg[j].start] != 0x7f7f7f7f)
dis[eg[j].to] = min(dis[eg[j].to], dis[eg[j].start] + eg[j].w);
for (int j = 1; j <= ptr; ++j)
if (dis[eg[j].start] != 0x7f7f7f7f && dis[eg[j].to] != 0x7f7f7f7f && dis[eg[j].start] + eg[j].w < dis[eg[j].to])
return 1;
return 0;
}
int main() {
scanf("%d", &t);
while (t--) {
memset(head, 0, sizeof head);
ptr = 0;
scanf("%d%d", &n, &m);
for (int i = 1; i <= m; ++i) {
int u, v, w;
scanf("%d%d%d", &u, &v, &w);
eg[++ptr] = {u, v, w, head[u]};
head[u] = ptr;
if (w > 0) {
eg[++ptr] = {v, u, w, head[v]};
head[v] = ptr;
}
}
printf("%s\n", (bellman() ? "YES" : "NO"));
}
return 0;
}
谢谢大佬们