#include<bits/stdc++.h>
#define endl '\n'
#define R(x) cin>>x
#define W(x) cout<<x
#define repA(i,e) for(int i=1;i<=e;i++)
#define repB(i,e) for(int i=e;i>=1;i--)
#define repC(i,s,e) for(int i=s;i<=e;i++)
#define repD(i,s,e) for(int i=s;i>=e;i--)
#define repE(i,s,e,t) for(int i=s;i<=e;i+=t)
#define repF(i,s,e,t) for(int i=s;i>=e;i-=t)
using namespace std;
typedef long long ll;
const int N=1e5+5,M=1e5+5;
int n,a,b,t;
int u,v,w;
int head[N],tot;
int vis[N];
string ans="NO";
struct edge{
int to,w,nxt,cnt;
}e[M];
void addedge(int u,int v,int w){
e[++tot].to=v;
e[tot].w=w;
e[tot].nxt=head[u];
head[u]=tot;
}
inline void dfs(int u,ll x,bool f){
if(ans=="YES") return;
if(f){
for(int i=1;i<=n;i++){
if(i!=b){
if(vis[i]>2) continue;
vis[i]++;
dfs(i,x,0);
vis[i]--;
}
}
}
for(auto i=head[u];i;i=e[i].nxt){
int v=e[i].to,w=e[i].w;
if(v==b){
if(x^w==0){
ans="YES";
return ;
}
continue ;
}
if(vis[v]>2) continue ;
vis[v]++;
dfs(v,x^w,f);
vis[v]--;
}
}
inline void init(){
ans="NO";
for(int i=1;i<=tot;i++) e[i].nxt=e[i].to=e[i].w=e[i].cnt=0;
for(int i=1;i<=n;i++) head[i]=vis[i]=0;
tot=0;
}
inline void solve(){
R(n);R(a);R(b);
init();
repA(i,n-1){
R(u);R(v);R(w);
addedge(v,u,w);
addedge(u,v,w);
}
vis[a]=1;
dfs(a,0ll,1);
W(ans);
cout<<endl;
}
signed main(){
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
R(t);
while(t--) solve();
return 0;
}