
#include<iostream>
#include<vector>
#include<algorithm>
#include<cstdio>
using namespace std;
struct data_edge
{
int a,b,yes_or_no;
}sn[1000000+5];
bool cmp(data_edge a,data_edge b)
{
return a.yes_or_no>b.yes_or_no;
}
int ans_p,gs_a,t;
struct data
{
struct hash
{
struct data1
{
int x,c;
};
int n;
vector <data1> hash[1000007];
int find_it(int x)
{
int y=x%1000007;
if (hash[y].size()>0)
{
for (int i=0;i<=hash[y].size()-1;i++)
if (hash[y][i].x==x) return hash[y][i].c;
}
return -1;
}
void add(int num)
{
int p=find_it(num);
if (p==-1)
{
int y=num%1000007;
n++;
data1 fff;
fff.x=num;
fff.c=n;
hash[y].push_back(fff);
p=n;
}
}
};
hash has;
struct bcj
{
int s[2000000+5],cz,cs1,cs2,n,m;
int cxg(int p)
{
int zz=p;
while (s[zz]>=0)
zz=s[zz];
int zz2=p;
while (zz!=p)
{zz2=s[p];s[p]=zz;p=zz2;}
return zz;
}
void hb(int hb1,int hb2)
{
int zz1=cxg(hb1);
int zz2=cxg(hb2);
if (zz1!=zz2)
if (s[zz1]<s[zz2])
{
s[zz1]+=s[zz2];
s[zz2]=zz1;
}
else
{
s[zz2]+=s[zz1];
s[zz1]=zz2;
}
return ;
}
bool cxqq(int p1,int p2)
{
if (cxg(p2)==cxg(p1))
return 1;
else
return 0;
}
}bc;
void get_data()
{
ans_p=1;
bc.n=has.n;
for (int i=1;i<=bc.n;i++)
bc.s[i]=-1;
for (int i=1;i<=gs_a;i++)
{
if (sn[i].yes_or_no==1)
bc.hb(has.find_it(sn[i].a),has.find_it(sn[i].b));
else
if (bc.cxqq(has.find_it(sn[i].a),has.find_it(sn[i].b))==1) ans_p=0;
}
}
}data_use[10+5];
int main()
{
scanf("%d",&t);
for (int test=1;test<=t;test++)
{
scanf("%d",&gs_a);
for (int i=1;i<=gs_a;i++)
scanf("%d%d%d",&sn[i].a,&sn[i].b,&sn[i].yes_or_no);
sort(sn+1,sn+gs_a+1,cmp);
for (int i=1;i<=gs_a;i++)
{
data_use[test].has.add(sn[i].a);
data_use[test].has.add(sn[i].b);
}
data_use[test].get_data();
if (ans_p==0) printf("NO\n"); else printf("YES\n");
}
return 0;
}