#include<bits/stdc++.h>
using namespace std;
const int MAXN = 100005;
struct Edge{
int v, w, next;
}edge[MAXN];
int tot, head[MAXN], n, m, s;
void AddEdge(int u, int v, int w) {
edge[tot].v = v;
edge[tot].w = w;
edge[tot].next = head[u];
head[u] = tot++;
}
int dis[MAXN], vt[MAXN], ans = 0;
bool vis[MAXN];
queue<int> q;
void init(){
memset(head, -1, sizeof(head));
memset(dis, 0x3f, sizeof(dis));
memset(vis, 0, sizeof(vis));
memset(vt, 0, sizeof(vt));
tot = 0;
for (int i = 0; i < n; i++) {
edge[i].next= 0;
}
}
void spfa(int s){
dis[s] = 0;
vis[s] = 1;
q.push(s);
int last = 0;
while(!q.empty()){
int pnum = q.front();
q.pop();
vis[pnum] = 0;
for (int i = head[pnum]; i != -1; i = edge[i].next) {
int pnext = edge[i].v, pndis = edge[i].w;
if(pnext == last)continue;
if (dis[pnum] + pndis < dis[pnext]){
dis[pnext] = dis[pnum] + pndis;
vt[pnext] = vt[pnum] + 1;
if(vt[pnext] >= n){
ans = 1;
return;
}
if(vis[pnext] == 0){
vis[pnext] = 1;
q.push(pnext);
}
}
}
last = pnum;
}
}
void solve(){
init();
cin >> n >> m;
for (int i = 0; i < m; i++) {
int u, v, w;
cin >> u >> v >> w;
AddEdge(u, v, w);
if (w >= 0){
AddEdge(v, u, w);
}
}
ans = 0;
spfa(1);
if(ans)cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
int main() {
int t;cin >> t;
while(t--){
solve();
}
}