#include<bits/stdc++.h>
using namespace std;
int N,Q,flag,sizee,a,b,t,type,ans=1;
struct node
{
int height;
struct node *parent;
int data;
}*repa,*repb;
map<int,struct node *> maap;
vector<pair<int,int> > v;
vector<int> adj[100005];
int level[100005];
bool visited[100005];
void makeset(int data)
{
struct node *p=new node;
p->height=0;
p->parent=p;
p->data=data;
maap[data]=p;
}
struct node* findrep(struct node *p)
{
struct node* parent=p->parent;
if(parent==parent->parent)
{
return parent;
}
struct node *result=findrep(parent);
p->parent=result;
return result;
}
void joinset(int a,int b)
{
struct node *node1=maap[a];
struct node *node2=maap[b];
struct node *rep1=findrep(node1);
struct node *rep2=findrep(node2);
if(rep1==rep2)
return;
if(rep1->height>=rep2->height)
{
rep2->parent=rep1;
if(rep1->height==rep2->height)
rep1->height+=1;
}
else
rep1->parent=rep2;
}
bool isbipartite(int src)
{
int sizee,i;
queue<pair<int,int> > q;
q.push(make_pair(src,0));
visited[src]=true;
pair<int,int> p;
while(q.size())
{
p=q.front();
q.pop();
sizee=adj[p.first].size();
level[p.first]=p.second;
for(i=0;i<sizee;i++)
{
if(!visited[adj[p.first][i]])
{
visited[adj[p.first][i]]=true;
q.push(make_pair(adj[p.first][i],p.second+1));
}
else
{
if(p.second==level[adj[p.first][i]])
return false;
}
}
}
return true;
}
int main()
{
int i;
cin>>t;
while(t--)
{
cin>>N>>Q;
flag=1;
maap.clear();
memset(visited,false,sizeof(visited));
v.clear();
adj[0].clear();
for(i=1;i<=N;i++)
{
makeset(i);
adj[i].clear();
}
adj[i+1].clear();
for(i=0;i<Q;i++)
{
cin>>a>>b>>type;
if(type==0)
{
joinset(a,b);
}
else
{
if(a==b)
{
flag=0;
}
v.push_back(make_pair(a,b));
}
}
sizee=v.size();
for(i=0;i<sizee;i++)
{
a=v[i].first;b=v[i].second;
repa=findrep(maap[a]);repb=findrep(maap[b]);
if(repa==repb)
{
flag=0;
break;
}
adj[repa->data].push_back(repb->data);
adj[repb->data].push_back(repa->data);
}
for(i=1;i<=N;i++)
{
if(!visited[i])
{
if(!isbipartite(i))
flag=0;
}
}
if(flag==0)
cout<<"no"<<endl;
else
cout<<"yes"<<endl;
}
return 0;
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKaW50IE4sUSxmbGFnLHNpemVlLGEsYix0LHR5cGUsYW5zPTE7CgpzdHJ1Y3Qgbm9kZQp7CglpbnQgaGVpZ2h0OwoJc3RydWN0IG5vZGUgKnBhcmVudDsKCWludCBkYXRhOwp9KnJlcGEsKnJlcGI7CgptYXA8aW50LHN0cnVjdCBub2RlICo+IG1hYXA7CnZlY3RvcjxwYWlyPGludCxpbnQ+ID4gdjsKdmVjdG9yPGludD4gYWRqWzEwMDAwNV07CmludCBsZXZlbFsxMDAwMDVdOwpib29sIHZpc2l0ZWRbMTAwMDA1XTsKCnZvaWQgbWFrZXNldChpbnQgZGF0YSkKewogICAgc3RydWN0IG5vZGUgKnA9bmV3IG5vZGU7CiAgICBwLT5oZWlnaHQ9MDsKICAgIHAtPnBhcmVudD1wOwogICAgcC0+ZGF0YT1kYXRhOwogICAgbWFhcFtkYXRhXT1wOwp9CgpzdHJ1Y3Qgbm9kZSogZmluZHJlcChzdHJ1Y3Qgbm9kZSAqcCkKewoJCXN0cnVjdCBub2RlKiBwYXJlbnQ9cC0+cGFyZW50OwoKCQlpZihwYXJlbnQ9PXBhcmVudC0+cGFyZW50KQoJCXsKCQkJcmV0dXJuIHBhcmVudDsKCQl9CgoJCXN0cnVjdCBub2RlICpyZXN1bHQ9ZmluZHJlcChwYXJlbnQpOwoJCXAtPnBhcmVudD1yZXN1bHQ7CgkJcmV0dXJuIHJlc3VsdDsKfQoKdm9pZCBqb2luc2V0KGludCBhLGludCBiKQp7CglzdHJ1Y3Qgbm9kZSAqbm9kZTE9bWFhcFthXTsKCXN0cnVjdCBub2RlICpub2RlMj1tYWFwW2JdOwoKCXN0cnVjdCBub2RlICpyZXAxPWZpbmRyZXAobm9kZTEpOwoJc3RydWN0IG5vZGUgKnJlcDI9ZmluZHJlcChub2RlMik7CgoJaWYocmVwMT09cmVwMikKCXJldHVybjsKCglpZihyZXAxLT5oZWlnaHQ+PXJlcDItPmhlaWdodCkKCXsKCQlyZXAyLT5wYXJlbnQ9cmVwMTsKCQlpZihyZXAxLT5oZWlnaHQ9PXJlcDItPmhlaWdodCkKCQlyZXAxLT5oZWlnaHQrPTE7Cgl9CgllbHNlCgkJcmVwMS0+cGFyZW50PXJlcDI7Cn0KCgpib29sIGlzYmlwYXJ0aXRlKGludCBzcmMpCnsKICAgIGludCBzaXplZSxpOwogICAgcXVldWU8cGFpcjxpbnQsaW50PiA+IHE7CgogICAgcS5wdXNoKG1ha2VfcGFpcihzcmMsMCkpOwogICAgdmlzaXRlZFtzcmNdPXRydWU7CiAgICBwYWlyPGludCxpbnQ+IHA7CiAgICB3aGlsZShxLnNpemUoKSkKICAgIHsKICAgICAgICBwPXEuZnJvbnQoKTsKICAgICAgICBxLnBvcCgpOwogICAgICAgIHNpemVlPWFkaltwLmZpcnN0XS5zaXplKCk7CiAgICAgICAgbGV2ZWxbcC5maXJzdF09cC5zZWNvbmQ7CgogICAgICAgIGZvcihpPTA7aTxzaXplZTtpKyspCiAgICAgICAgewogICAgICAgICAgICBpZighdmlzaXRlZFthZGpbcC5maXJzdF1baV1dKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2aXNpdGVkW2FkaltwLmZpcnN0XVtpXV09dHJ1ZTsKICAgICAgICAgICAgICAgIHEucHVzaChtYWtlX3BhaXIoYWRqW3AuZmlyc3RdW2ldLHAuc2Vjb25kKzEpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmKHAuc2Vjb25kPT1sZXZlbFthZGpbcC5maXJzdF1baV1dKQogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgIH0KICAgIHJldHVybiB0cnVlOwp9CgppbnQgbWFpbigpCnsKICAgIGludCBpOwogICBjaW4+PnQ7CiAgIHdoaWxlKHQtLSkKICAgewogICAgY2luPj5OPj5ROwogICAgZmxhZz0xOwogICAgbWFhcC5jbGVhcigpOwogICAgbWVtc2V0KHZpc2l0ZWQsZmFsc2Usc2l6ZW9mKHZpc2l0ZWQpKTsKICAgIHYuY2xlYXIoKTsKCiAgICBhZGpbMF0uY2xlYXIoKTsKICAgIGZvcihpPTE7aTw9TjtpKyspCiAgICB7CiAgICBtYWtlc2V0KGkpOwogICAgYWRqW2ldLmNsZWFyKCk7CiAgICB9CgogICAgYWRqW2krMV0uY2xlYXIoKTsKCiAgICBmb3IoaT0wO2k8UTtpKyspCiAgICB7CiAgICAgICAgY2luPj5hPj5iPj50eXBlOwogICAgICAgIGlmKHR5cGU9PTApCiAgICAgICAgewogICAgICAgICAgICBqb2luc2V0KGEsYik7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIGlmKGE9PWIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgZmxhZz0wOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHYucHVzaF9iYWNrKG1ha2VfcGFpcihhLGIpKTsKICAgICAgICB9CiAgICB9CgogICAgc2l6ZWU9di5zaXplKCk7CgogICAgZm9yKGk9MDtpPHNpemVlO2krKykKICAgIHsKICAgICAgICBhPXZbaV0uZmlyc3Q7Yj12W2ldLnNlY29uZDsKICAgICAgICByZXBhPWZpbmRyZXAobWFhcFthXSk7cmVwYj1maW5kcmVwKG1hYXBbYl0pOwoKICAgICAgICBpZihyZXBhPT1yZXBiKQogICAgICAgIHsKICAgICAgICBmbGFnPTA7CiAgICAgICAgYnJlYWs7CiAgICAgICAgfQoKICAgICAgICBhZGpbcmVwYS0+ZGF0YV0ucHVzaF9iYWNrKHJlcGItPmRhdGEpOwogICAgICAgIGFkaltyZXBiLT5kYXRhXS5wdXNoX2JhY2socmVwYS0+ZGF0YSk7CiAgICB9CgogICAgZm9yKGk9MTtpPD1OO2krKykKICAgIHsKICAgICAgICBpZighdmlzaXRlZFtpXSkKICAgICAgICB7CiAgICAgICAgICAgIGlmKCFpc2JpcGFydGl0ZShpKSkKICAgICAgICAgICAgZmxhZz0wOwogICAgICAgIH0KICAgIH0KCiAgICBpZihmbGFnPT0wKQogICAgICAgIGNvdXQ8PCJubyI8PGVuZGw7CiAgICBlbHNlCiAgICAgICAgY291dDw8InllcyI8PGVuZGw7CgogICB9CiByZXR1cm4gMDsKfQo=