#include <iostream>
#include <unordered_map>
using namespace std;
int n, m, l, r, t, ut = 1, st = 1;
int eual[114514];
struct node{
unsigned int l, r;
} un[114514];
unordered_map<unsigned int, int> save;
int find(int x){
if(eual[x] == x){
return x;
}
return eual[x] = find(eual[x]);
}
void merge(int x, int y){
eual[find(x)] = find(y);
}
int main(){
cin >> n;
for(int i = 1; i <= n; i++){
cin >> m;
for(int j = 1; j <= 114514; j++){
eual[j] = j;
}
for(int j = 1; j <= m; j++){
cin >> l >> r >> t;
if(save.find(l) == save.end()){
save[l] = st;
st++;
}
if(save.find(r) == save.end()){
save[r] = st;
st++;
}
if(t == 0){
un[ut].l = l;
un[ut].r = r;
ut++;
}
else{
merge(save[l], save[r]);
}
}
for(int j = 1; j <= ut; j++){
if(j == ut){
cout << "YES" << '\n';
break;
}
if(find(save[un[j].l]) == find(save[un[j].r]) && save[un[j].l] != save[un[j].r){
cout << "NO" << '\n';
break;
}
}
ut = st = 1;
save.clear();
}
}