记录
#include <iostream>
#include <algorithm>
#include <string.h>
using namespace std;
int t;
struct node
{
int x, y, e;
}a[100010];
int cnt, n, f[100010], b[200010];
bool flag;
bool cmp(node xx, node yy)
{
return xx.e > yy.e;
}
int findd(int xx)
{
if(xx == f[xx])
{
return xx;
}
return findd(f[xx]);
}
int main()
{
cin >> t;
while(t--)
{
memset(a, 0, sizeof(a));
memset(b, 0, sizeof(b));
memset(f, 0 ,sizeof(f));
cnt = 0;
flag = true;
cin >> n;
for(int i = 1; i <= n; ++i)
{
cin >> a[i].x >> a[i].y >> a[i].e;
b[++cnt] = a[i].x;
b[++cnt] = a[i].y;
}
sort(b + 1, b + 2 * n + 1);
cnt = unique(b, b + 2 * n + 1) - b;
for(int i = 1; i <= n; ++i)
{
a[i].x = lower_bound(b + 1, b + cnt + 1, a[i].x) - b;
a[i].y = lower_bound(b + 1, b + cnt + 1, a[i].y) - b;
}
for(int i = 1; i <= cnt; ++i)
{
f[i] = i;
}
sort(a + 1, a + n + 1, cmp);
for(int i = 1, xx, yy; i <= n; ++i)
{
xx = findd(a[i].x);
yy = findd(a[i].y);
if(a[i].e)
{
f[xx] = yy;
}
else if(xx == yy)
{
cout << "NO" << '\n';
flag = false;
break;
}
}
if(flag)
{
cout << "YES" << '\n';
}
}
return 0;
}