100pts:
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
int t,n,a[maxn],b[maxn],c[maxn];
map<int,int>mp;
//x[i]!=x[i+n]
int find(int x){
if(mp[x]==0)mp[x]=x;
if(mp[x]==x)return x;
else return mp[x]=find(mp[x]);
}
int main(){
cin>>t;
while(t--){
cin>>n;
mp.clear();
bool check=1;
for(int i=1;i<=n;i++)
scanf("%d%d%d",&a[i],&b[i],&c[i]);
for(int i=1;i<=n;i++)
if(c[i]==1)
mp[find(a[i])]=find(b[i]);
for(int i=1;i<=n;i++)
if(c[i]==0)
if(find(a[i])==find(b[i])){
check=0;
break;
}
if(check==1)
cout<<"YES\n";
else
cout<<"NO\n";
}
}
50pts::
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
int t,n,a[maxn],b[maxn],c[maxn];
map<int,int>mp;
const int p=1e9+5;
//x[i]!=x[i+n]
int find(int x){
if(mp[x]==0)mp[x]=x;
if(mp[x]==x)return x;
else return mp[x]=find(mp[x]);
}
int main(){
cin>>t;
while(t--){
cin>>n;
mp.clear();
bool check=1;
for(int i=1;i<=n;i++)
scanf("%d%d%d",&a[i],&b[i],&c[i]);
for(int i=1;i<=n;i++){
if(c[i]==1){
mp[find(a[i])]=find(b[i]);
}else if(c[i]==0){
mp[find(a[i])]=find(b[i]+p);
mp[find(b[i])]=find(a[i]+p);
}
if(find(a[i])==find(a[i]+p)||find(b[i])==find(b[i]+p)){
check=0;
break;
}
}
if(check==1)
cout<<"YES\n";
else
cout<<"NO\n";
}
}