#include <bits/stdc++.h>
#define IOS ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define _zero(a) memset(a, 0, sizeof(a))
#define endl '\n'
#define int long long
#define mp make_pair
#define PII pair<int, int>
#define x first
#define y second
#define all(a) (a).begin(), (a).end()
#define rall(a) (a).rbegin(), (a).rend()
#define PII pair<int, int>
typedef long long ll;
typedef double dd;
typedef long double ld;
using namespace std;
const int inf = 1e10;
const int M = 998244353;
const ld pi = atan2(0, -1);//arctan(y/x);
const ld eps = 1e-8;
const int maxn = 2e5 + 110;
int fa[maxn];
void init()//第一个操作:初始化,将所有节点的父节点指向自己
{
for(int i=0;i<=maxn;i++)
fa[i]=i;
}
int find_(int i)//查找i节点的最高父节点,未进行路径压缩
{
if(fa[i]==i)return i;//指向自己为最高父节点
else return find_(fa[i]);//否则继续递归查找
}
int find_d(int i)//压缩路径,直接将i的父节点置为最高父节点
{
if(fa[i]==i)return i;
else
fa[i]=find_d(fa[i]);
return fa[i];
}
void unionn(int i,int j)
{
int i_fa=find_d(i);//找到i的最高父节点
int j_fa=find_d(j);
fa[i_fa]=j_fa;//i的最高父节点的父节点设置为j的最高父节点
}
int g[3][maxn];
vector<int> cur;
int n;
int get(int x)
{
return lower_bound(all(cur), x) - cur.begin();
}
void solve()
{
for (int i = 0; i < n; i ++) {
int a = g[0][i], b = g[1][i], c = g[2][i];
a = get(a); b = get(b);
if (c == 1) {
unionn(a, b);
}
}
for (int i = 0; i < n; i ++) {
int a = g[0][i], b = g[1][i], c = g[2][i];
a = get(a); b = get(b);
if (c == 0) {
if (find_d(a) == find_d(b)) {
cout << "NO" << endl;
return;
}
}
}
cout << "YES" << endl;
}
signed main()
{
IOS;
int tt;
cin >> tt;
while (tt--) {
cin >> n;
int a, b, c;
cur.clear();
for (int i = 0; i < n; i ++) {
cin >> a >> b >> c;
g[0][i] = a, g[1][i] = b, g[2][i] = c;
cur.push_back(a);
cur.push_back(b);
}
sort(all(cur));
cur.erase(unique(all(cur)), cur.end());
init();
solve();
}
return 0;
}