如果$x_i=x_j$,就用冰茶姬将其合并。
如果$x_i\ne x_j$,并不能马上判断出来是否违背,必须等所有$=$的条件处理完之后,才能操作。
由于$x_i$很大,离散化一下即可。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#define gc getchar()
using namespace std;
const int N=1e6+10;
inline void qr(int &x)
{
    x=0;char c=gc;int f=1;
    while(c<'0'||c>'9'){if(c=='-')f=-1;c=gc;}
    while(c>='0'&&c<='9'){x=x*10+(c^48);c=gc;}
    x*=f;
}
int fa[N<<1],arr[N<<1],sz;
struct node{int a,b,q;bool operator <(const node a)const{return q>a.q;}}a[N];
void disc()
{
    sort(arr+1,arr+sz+1);int len=0;
    for(int i=1;i<=sz;i++)
        if(i==1||arr[i]!=arr[i-1])arr[++len]=arr[i];
    sz=len;
}
inline int get(int d)
{
    int l=1,r=sz+1;
    while(l<r)
    {
        int mid=l+r>>1;
        if(arr[mid]<d)l=mid+1;
        else r=mid;  
    }
    return l;
}
int find(int x){return x==fa[x]?x:fa[x]=find(fa[x]);}
int main()
{
    int T;qr(T);
    while(T--)
    {
        int n;qr(n);sz=0;
        for(int i=1;i<=n;i++)qr(a[i].a),qr(a[i].b),qr(a[i].q),arr[++sz]=a[i].a,arr[++sz]=a[i].b;
        disc();sort(a+1,a+n+1);for(int i=1;i<=sz;i++)fa[i]=i;bool bk=1;int i;
        for(i=1;i<=n;i++)
        {
            int x=get(a[i].a),y=get(a[i].b),Q=a[i].q;
            if(Q==0)break;
            int fx=find(x),fy=find(y);
            if(fx!=fy)fa[fx]=fy;
        }
        for(;i<=n;i++)
        {
            int x=get(a[i].a),y=get(a[i].b);
            int fx=find(x),fy=find(y);
            if(fx==fy){bk=0;puts("NO");break;}
        }
        if(bk)puts("YES");
    }
    return 0;
}