#include <bits/stdc++.h>
#define fast ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0);
#define ll long long
#define ld long double
#define pb push_back
using namespace std;
vector<vector<int>>v;
map<pair<int,int>,int>cost;
bool vis[(int)1e5+5];
map<int,int>source;
int a,b;
bool o=0;
void dfs1(int node,int x)
{
    vis[node]=1;
    for(auto child:v[node])
    {
        if(!vis[child])
        {
            if(child!=b) // not reaching dest from source
            {
                source[x^cost[{node,child}]]=1;
                dfs1(child,x^cost[{node,child}]);
            }
        }
    }
}
void dfs2(int node,int x)
{
    vis[node]=1;
     for(auto child:v[node])
    {
        if(!vis[child])
        {
                if(source[x^cost[{node,child}]]|| (x^cost[{node,child}])==0)
                   o=1;
                dfs2(child,x^cost[{node,child}]);
        }
    }
}
int main()
{fast
int t;
cin>>t;
while(t--)
{
  int n;
  cin>>n>>a>>b;
  v.clear();
  v.resize(n+1);
  source.clear();
  cost.clear();
  o=0;
  for(int i=1;i<=n;i++) vis[i]=0;
  int x,y,z;
  for(int i=0;i<n-1;i++)
  {
      cin>>x>>y>>z;
      v[x].pb(y);
      v[y].pb(x);
      cost[{x,y}]=z;
      cost[{y,x}]=z;
  }
dfs1(a,0); //go from source
for(int i=1;i<=n;i++) vis[i]=0;
dfs2(b,0) ;//go from dest
(o)?cout<<"YES\n":cout<<"NO\n";
}
return 0;
}