#include <bits/stdc++.h>
using namespace std;
int ri() {
  int x;
  if (scanf(" %d", &x) == EOF) return -1;
  return x;
}
long long int rl() {
  long long int x;
  if (cin >> x) return x;
  return -1;
}
string rs() {
  string s;
  if (cin >> s) return s;
  return "";
}
struct Dfs {
  const vector<vector<int> >& edges;
  const int n;
  vector<int> dist;
  vector<int> vis;
  Dfs(const vector<vector<int> >& _edges) : edges(_edges), n(_edges.size()) {}
  void start(int startIdx) {
    dist = vector<int>(n, n + 1);
    vis = vector<int>(n, 0);
    dfs(startIdx, 0);
  }
  void dfs(int u, int depth) {
    if (vis[u]) return;
    vis[u] = 1;
    dist[u] = depth;
    for (auto v : edges[u])
      if (!vis[v]) {
        dfs(v, depth + 1);
      }
  }
  pair<int, int> deepest() {
    int u = 0;
    for (int i = 0; i < n; ++i)
      if (dist[i] > dist[u]) {
        u = i;
      }
    return {u, dist[u]};
  }
  int distanceTo(int u) { return dist[u]; }
};
struct SingleCase {
  int n;
  vector<vector<int> > edges;
  bool solveCase() {
    n = ri();
    if (n < 0) return false;
    int A = ri() - 1;
    int B = ri() - 1;
    int dA = ri();
    int dB = ri();
    edges = vector<vector<int> >(n);
    for (int i = 0; i < (n - 1); ++i) {
      int u = ri() - 1;
      int v = ri() - 1;
      edges[u].push_back(v);
      edges[v].push_back(u);
    }
    Dfs first(edges);
    first.start(B);
    int dAB = first.distanceTo(A);
    Dfs second(edges);
    second.start(first.deepest().first);
    int longestPath = second.deepest().second;
    bool bob = longestPath > 2 * dA && dB > 2 * dA && dAB > dA;
    string ret = bob ? "Bob" : "Alice";
    cout << ret << endl;
    return true;
  }
};
int main() {
  ri();
  while (SingleCase().solveCase()) {
  };
  return 0;
}
