rt
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5;
int fa[N];
struct data{
int x,y,e;
}a[N];
bool cmp_sort(data x,data y){return x.e>y.e;}
int find(int x)
{return fa[x]==x?x:fa[x]=find(fa[x]);}
int T,n;
int main()
{
cin>>T;
while(T--)
{
int b[N];
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(fa,0,sizeof(fa));
cin>>n;int tot=0;
for(int i=1;i<=n;++i)
{
cin>>a[i].x>>a[i].y>>a[i].e;
b[++tot]=a[i].x;//记录这些值
b[++tot]=a[i].y;
}
sort(b+1,b+1+tot);
int tott=unique(b+1,b+1+tot)-b;
//algorithm中的函数,把数组去重,然后返回末尾指针。这里减一个b就可以表示b现在的大小了
for(int i=1;i<=n;++i)
{
a[i].x=lower_bound(b+1,b+1+tott,a[i].x)-b;//十分实用的lower_bound,寻找b中>=a[i].x的第一个数的指针
//(因为a[i].x在b中一定存在,所以是直接求出a[i].x离散化后对应的值),减去b就是它的位置。
a[i].y=lower_bound(b+1,b+1+tott,a[i].y)-b;
}
for(int i=1;i<=tott;++i) fa[i]=i;
sort(a+1,a+1+n,cmp_sort);
bool ck=1;
for(int i=1;i<=n;++i)
{
if(a[i].e==1 && (find(a[i].x)!=find(a[i].y)))
fa[find(a[i].x)]=a[i].y;
else
if(find(a[i].x)==find(a[i].y))
{ck=0;break;}
}
ck==1?cout<<"YES"<<endl:cout<<"NO"<<endl;
}
return 0;
}