rt
#include <iostream>
#include <cstdio>
#include <queue>
#include <cstring>
using namespace std;
struct edge {
int y,dis;
};
const int inf = 0x3f3f3f3f;
const int N=1e5+5;
int n,m,s,t,u,v,w, d[N], cnt[N];
vector<edge> a[N];
bool vis[N];
queue<int> q;
bool spfa();
int main(){
ios::sync_with_stdio(0);
// freopen("5.in","r",stdin);
// freopen("5.ans","w",stdout);
cin>>t;
memset(d,0x7f,sizeof(d));
while(t--){
for(int i=0;i<N;i++){
a[i].clear();
}
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>u>>v>>w;
if(w>=0){
a[u].push_back((edge){v,w});
a[v].push_back((edge){u,w});
}else{
a[u].push_back((edge){v,w});
}
}if(spfa()==1)cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}bool spfa(){
memset(d,0x7f,sizeof(d));
memset(cnt,0,sizeof(cnt));
memset(vis,0,sizeof(vis));
q.push(1);
vis[1]=1;
while(!q.empty()){
int x=q.front();
q.pop();
vis[x]=0;
for(int i=0;i<a[x].size();i++){
if(d[a[x][i].y]>d[x]+a[x][i].dis){
d[a[x][i].y]=d[x]+a[x][i].dis;
cnt[a[x][i].y]=cnt[x]+1;
if(!vis[a[x][i].y]){
q.push(a[x][i].y);
}
if(cnt[a[x][i].y]>m)return 1;
}
}
}return 0;
}