#include <bits/stdc++.h>
using namespace std;
vector<long long int> primes;
void Sieve(long long int n) {
  vector<bool> prime(n + 1, true);
  for (long long int p = 2; p * p <= n; p++) {
    if (prime[p] == true) {
      for (long long int i = p * p; i <= n; i += p) prime[i] = false;
    }
  }
  for (long long int p = 2; p <= n; p++)
    if (prime[p]) primes.push_back(p);
}
vector<bool> vis;
long long int dia = 0;
long long int dfs(long long int x, vector<vector<long long int>>& vec) {
  vis[x] = true;
  priority_queue<long long int> pq;
  for (auto it : vec[x]) {
    if (vis[it] != true) pq.push(dfs(it, vec) + 1);
  }
  if (pq.size() == 0)
    return 0;
  else if (pq.size() == 1) {
    long long int p = pq.top();
    dia = max(dia, p);
    return p;
  } else {
    long long int p = pq.top();
    pq.pop();
    long long int y = pq.top();
    dia = max(dia, p + y);
    return p;
  }
}
int main() {
  long long int t;
  cin >> t;
  while (t--) {
    long long int n, a, b, da, db;
    cin >> n;
    cin >> a;
    cin >> b;
    cin >> da;
    cin >> db;
    vector<vector<long long int>> vec(n + 1);
    for (long long int i = 0; i < n - 1; i++) {
      long long int x, y;
      cin >> x;
      cin >> y;
      vec[x].push_back(y);
      vec[y].push_back(x);
    }
    vector<bool> visited(n + 1, 0);
    queue<pair<long long int, long long int>> q;
    q.push({a, 0});
    long long int dis = 0;
    while (!q.empty()) {
      pair<long long int, long long int> p = q.front();
      q.pop();
      if (p.first == b) {
        dis = p.second;
        break;
      }
      for (auto it : vec[p.first]) {
        if (!visited[it]) {
          q.push({it, p.second + 1});
          visited[it] = true;
        }
      }
    }
    vis = vector<bool>(n + 1, 0);
    dfs(1, vec);
    cout << (2 * da >= min(dia, db) || dis <= da ? "Alice" : "Bob") << '\n';
    dia = 0;
  }
  return 0;
}
