#include<bits/stdc++.h>
using namespace std;
typedef long long llint;
int n,t;
struct node {
llint x,y,e;
} s[100005];
unordered_map<llint,int> h;
int fa[200005];
inline void init() {
for(int i=1; i<=2*n; i++)fa[i]=i;
}
int find(int p) {
return p==fa[p]?p:(fa[p]=find(fa[p]));
}
inline void merge(int x,int y) {
fa[find(x)]=find(y);
}
int main() {
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
cin>>t;
while(t--) {
h.clear();
bool f=1;
cin>>n;
init();
int cnt=0;
for(int i=1; i<=n; i++) {
llint p,q,r;
cin>>p>>q>>r;
s[i]= {p,q,r};
if(r==0)continue;
if(h[p]==0)h[p]=(++cnt);
if(h[q]==0)h[q]=(++cnt);
merge(h[p],h[q]);
}
for(int i=1; i<=n; i++) {
if(s[i].e==1)continue;
int p=s[i].x,q=s[i].y;
//不加下面的判定如果h[p]==0就会continue!
if(p==q){
cout<<"NO\n";
f=0;
break;
}
if(h[p]==0||h[q]==0)continue;
if(find(h[p])==find(h[q])) {
cout<<"NO\n";
f=0;
break;
}
}
if(f)cout<<"YES\n";
}
}
应该也就我能犯这种错误吧