#include <bits/stdc++.h>
#define int long long
namespace ZBOI {
inline int read() {
int f = 0, n = 1;
char ch = getchar();
while (ch < '0' || ch > '9') {
if (ch == '-') n = -1;
ch = getchar();
}
while (ch >= '0' && ch <= '9') {
f = (f << 1) + (f << 3) + (ch ^ 48);
ch = getchar();
}
return f * n;
}
inline void write(int x) {
if (!x) putchar('0');
else {
if (x < 0) putchar('-'), x = -x;
int sta[100], cnt = 0;
while (x) {
sta[++ cnt] = x % 10;
x /= 10;
}
for (int i = cnt; i >= 1; -- i)
putchar('0' + sta[i]);
}
}
inline int min(int x, int y) {
if (x < y) return x;
return y;
}
}
using namespace std;
using namespace ZBOI;
const int N = 1e5 + 5;
int T, n, a, b, flag;
int tot = 1, h[N * 2], vi[N * 2];
map <int, int> vis;
struct edge {
int nxt, to, w;
} e[N];
inline void add(int u, int v, int w) {
e[++ tot].nxt = h[u];
e[tot].to = v;
e[tot].w = w;
h[u] = tot;
}
void dfsA(int s, int dis) {
for (int i = h[s]; i; i = e[i].nxt) {
int v = e[i].to;
if (vi[i] || vi[i ^ 1] || v == b) continue;
vi[i] = 1, vi[i ^ 1] = 1;
vis[dis ^ e[i].w] = 1;
dfsA(v, dis ^ e[i].w);
}
}
void dfsB(int s, int dis) {
for (int i = h[s]; i; i = e[i].nxt) {
int v = e[i].to;
if (vi[i] || vi[i ^ 1]) continue;
vi[i] = 1, vi[i ^ 1] = 1;
if (vis[dis ^ e[i].w]) {
flag = 1;
return;
}
dfsB(v, dis ^ e[i].w);
}
}
signed main() {
cin >> T;
while (T --) {
cin >> n >> a >> b;
memset(h, 0, sizeof(h));
tot = 1, flag = 0;
vis.clear();
for (int i = 1, u, v, w; i < n; ++ i) {
u = read(), v = read(), w = read();
add(u, v, w);
add(v, u, w);
}
memset(vi, 0, sizeof(vi));
dfsA(a, 0);
memset(vi, 0, sizeof(vi));
dfsB(b, 0);
if (flag) cout << "YES\n";
else cout << "NO\n";
}
return 0;
}