#include <bits/stdc++.h>
using namespace std;
template <typename T>
inline bool upmin(T &x, T y) {
  return y < x ? x = y, 1 : 0;
}
template <typename T>
inline bool upmax(T &x, T y) {
  return x < y ? x = y, 1 : 0;
}
const long double eps = 1e-11;
const long double pi = acos(-1);
const int oo = 1 << 30;
const long long loo = 1ll << 62;
const int mods = 998244353;
const int MAXN = 2000005;
const int INF = 0x3f3f3f3f;
inline int read() {
  int f = 1, x = 0;
  char c = getchar();
  while (c < '0' || c > '9') {
    if (c == '-') f = -1;
    c = getchar();
  }
  while (c >= '0' && c <= '9') {
    x = (x << 3) + (x << 1) + (c ^ 48);
    c = getchar();
  }
  return x * f;
}
char st[MAXN];
int n, nodenum, d[MAXN];
vector<int> e[MAXN], V[MAXN];
void add_edge(int u, int v) {
  e[u].push_back(v), e[v].push_back(u);
  d[u]++, d[v]++;
}
int dfs(int x, int father, int dep, int y) {
  if (x == y) return dep & 1;
  for (auto v : e[x]) {
    if (v == father) continue;
    int q = dfs(v, x, dep + 1, y);
    if (q != -1) return q;
  }
  return -1;
}
bool solve() {
  for (int i = 1; i <= nodenum; i++) {
    if (d[i] >= 4) return 1;
    V[d[i]].push_back(i);
  }
  if (V[3].size() >= 3) return 1;
  if (V[3].size() == 2 && dfs(V[3][0], 0, 1, V[3][1])) return 1;
  for (auto x : V[3]) {
    int cnt1 = 0, cnt2 = 0;
    for (auto v : e[x])
      if (d[v] >= 2) cnt2++;
    if (cnt2 >= 2) return 1;
  }
  return 0;
}
int main() {
  int Case = read();
  while (Case--) {
    n = nodenum = read();
    for (int i = 1; i < n; i++) {
      int u = read(), v = read();
      add_edge(u, v);
    }
    scanf("%s", st + 1);
    for (int i = 1; i <= n; i++)
      if (st[i] == 'W') {
        nodenum += 3;
        add_edge(i, nodenum - 2);
        add_edge(nodenum - 2, nodenum - 1);
        add_edge(nodenum - 2, nodenum);
      }
    puts(solve() ? "White" : "Draw");
    for (int i = 1; i <= nodenum; i++) e[i].clear(), V[i].clear(), d[i] = 0;
  }
  return 0;
}
