RT
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <string>
#include <cstring>
#include <queue>
using namespace std;
long t, n, p, q, f[1000005], m[3000005];
struct node {
long a, b, e;
} k[1000005];
bool cmp(node a, node b) {
return a.e > b.e;
}
long find(long x) {
if (x == f[x]) return x;
return f[x] = find(f[x]);
}
int main() {
scanf("%ld", &t);
while (t--) {
q = -1, p = 1;
memset(m, 0, sizeof(m));
memset(k, 0, sizeof(k));
memset(f, 0, sizeof(f));
scanf("%ld", &n);
for (long i = 1; i <= n; i++) scanf("%ld %ld %ld", &k[i].a, &k[i].b, &k[i].e);
for (long i = 1; i <= n; i++) m[++q] = k[i].a;
for (long i = 1; i <= n; i++) m[++q] = k[i].b;
sort(m, m + q);
for (long i = 1; i <= n; i++) k[i].a = lower_bound(m, unique(m, m + q), k[i].a) - m;
for (long i = 1; i <= n; i++) k[i].b = lower_bound(m, unique(m, m + q), k[i].b) - m;
for (long i = 1; i <= unique(m, m + q) - m; i++) f[i] = i;
sort(k + 1, k + n + 1, cmp);
for (long i = 1; i <= n; i++) {
long u = find(k[i].a), v = find(k[i].b);
if (k[i].e) f[u] = v;
else if (u == v) {
printf("NO\n");
p = 0;
break;
}
}
if (p) printf("YES\n");
}
return 0;
}