#include <bits/stdc++.h>
using namespace std;
long long int power(long long int x, long long int y, long long int p) {
  long long int res = 1;
  x = x % p;
  while (y > 0) {
    if (y & 1) res = (res * x) % p;
    y = y >> 1;
    x = (x * x) % p;
  }
  return res;
}
long long int modInverse(long long int n, long long int p) {
  return power(n, p - 2, p);
}
struct point {
  long long int x, y;
};
void bfs(long long int node, vector<long long int> adj[], vector<bool> &visit,
         vector<long long int> &dis) {
  queue<long long int> q;
  visit[node] = true;
  dis[node] = 0;
  q.push(node);
  while (!q.empty()) {
    long long int s = q.front();
    q.pop();
    for (auto u : adj[s]) {
      if (visit[u]) continue;
      visit[u] = true;
      dis[u] = dis[s] + 1;
      q.push(u);
    }
  }
}
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  long long int tests;
  cin >> tests;
  for (long long int gg = 0; gg < tests; gg++) {
    long long int n, a, b, da, db;
    cin >> n >> a >> b >> da >> db;
    vector<long long int> adj[n + 1];
    for (long long int i = 0; i < n - 1; i++) {
      long long int x, y;
      cin >> x >> y;
      adj[x].push_back(y);
      adj[y].push_back(x);
    }
    vector<bool> visit(n + 1, false);
    vector<long long int> dis(n + 1, 0);
    bfs(a, adj, visit, dis);
    if (dis[b] <= da) {
      cout << "Alice\n";
      continue;
    }
    if (db > 2 * da) {
      long long int m1 = *max_element(dis.begin(), dis.end()), node1 = 0;
      for (long long int i = 1; i < n + 1; i++) {
        if (dis[i] == m1) {
          node1 = i;
          break;
        }
      }
      visit.assign(n + 1, false);
      dis.assign(n + 1, 0);
      bfs(node1, adj, visit, dis);
      long long int dia = *max_element(dis.begin(), dis.end());
      if (dia > 2 * da) {
        cout << "Bob\n";
      } else {
        cout << "Alice\n";
      }
    } else {
      cout << "Alice\n";
    }
  }
}
