#include <bits/stdc++.h>
using namespace std;
template <typename... Ts>
void do_nothing(Ts &&...vals) {}
constexpr long long MOD = 1000000007;
constexpr int INF = 0x7f7f7f7f;
constexpr double EPS = 1e-8;
long long fastPow(long long num, long long exp, long long modNum) {
  if (exp == 0) return 1;
  if (exp == 1)
    return num;
  else {
    long long half = fastPow(num, exp / 2, modNum) % modNum;
    if (exp % 2 == 1) {
      return (((half * half) % modNum) * num) % modNum;
    } else {
      return (half * half) % modNum;
    }
  }
}
long long fastPow(long long num, long long exp) {
  if (exp == 0) return 1;
  if (exp == 1)
    return num;
  else {
    long long half = fastPow(num, exp / 2);
    if (exp % 2 == 1) {
      return (((half * half)) * num);
    } else {
      return (half * half);
    }
  }
}
long long getReverse(long long y, long long modNum) {
  return fastPow(y, modNum - 2, modNum) % modNum;
}
long long gcd(long long a, long long b) {
  return (a % b == 0) ? b : gcd(b, a % b);
}
int dfs(int node, int parent, vector<vector<int>> &edges, int &diameter) {
  int len1 = 0, len2 = 0;
  for (auto adj : edges[node]) {
    if (adj == parent) continue;
    int len = dfs(adj, node, edges, diameter);
    if (len > len1) {
      swap(len, len1);
    }
    if (len > len2) {
      swap(len, len2);
    }
  }
  diameter = max((long long)diameter, (long long)len1 + len2);
  return len1 + 1;
}
void getDis(int node, int parent, vector<vector<int>> &edges,
            vector<int> &dis) {
  if (parent != -1) dis[node] = dis[parent] + 1;
  for (auto adj : edges[node]) {
    if (adj == parent) continue;
    getDis(adj, node, edges, dis);
  }
}
int main(int argn, char **argv) {
  ios::sync_with_stdio(false);
  cout.tie(nullptr);
  cin.tie(nullptr);
  int T = 1;
  cin >> T;
  for (int(I) = (0); (I) <= ((T)-1); (I)++) {
    int n, a, b, da, db;
    cin >> n >> a >> b >> da >> db;
    a--;
    b--;
    vector<vector<int>> edges(n);
    for (int(i) = (0); (i) <= ((n - 1) - 1); (i)++) {
      int u, v;
      cin >> u >> v;
      u--;
      v--;
      edges[u].emplace_back(v);
      edges[v].emplace_back(u);
    }
    int diameter = 0;
    dfs(0, -1, edges, diameter);
    vector<int> disA(n, 0), disB(n, 0);
    getDis(a, -1, edges, disA);
    getDis(b, -1, edges, disB);
    int distance = 1e9;
    for (int(i) = (0); (i) <= ((n)-1); (i)++) {
      distance = min(distance, disA[i] + disB[i]);
    }
    if (2 * da >= min(db, diameter) || distance <= da) {
      cout << "Alice" << endl;
    } else {
      cout << "Bob" << endl;
    }
  }
}
