#include<cstdio>
#include<vector>
#include<string.h>
#include<queue>
#define int long long
inline void r(int &x)
{
char c;
int bl=1;
while((c=getchar())<'0') if(c=='-') bl=-1;;
x=c^'0';
while((c=getchar())>='0') x=(x<<3)+(x<<1)+(c^'0');
x*=bl;
}
const int maxn=2e3+10;
int n,m,dis[maxn],vis[maxn],cnt[maxn];
struct edge{int t,w;};
std::vector<edge>v[maxn];
inline void clear(){for(int i=1;i<=n;i++) v[i].clear(),vis[i]=0,cnt[i]=0;}
inline void add(int s,int e,int w)
{
if(w>=0) v[s].push_back({e,w}),v[e].push_back({s,w});
else v[s].push_back({e,w});
}
bool spfa()
{
memset(dis,0x3f,sizeof dis);
std::deque<int>q;
q.push_back(1),dis[1]=0,vis[1]=1;
cnt[1]++;
while(!q.empty())
{
int x=q.front();
q.pop_front();
vis[x]=0;
for(int i=0;i<v[x].size();i++)
{
int t=v[x][i].t,w=v[x][i].w;
if(dis[t]>dis[x]+w)
{
dis[t]=dis[x]+w;
if(!vis[t])
{
vis[t]=1;
if(++cnt[t]>=n) return 1;
if(q.empty()) q.push_back(t);
else if(dis[t]>=dis[q.front()]) q.push_back(t);
else q.push_front(t);
}
}
}
}
return 0;
}
signed main()
{
int t,s,e,w;
r(t);
while(t--)
{
r(n),r(m);
while(m--) r(s),r(e),r(w),add(s,e,w);
printf((spfa()?"YES\n":"NO\n"));
clear();
}
return 0;
}