// Template begins
#include <iostream>
#include <algorithm>
#include <vector>
#include <map>
#include <set>
#include <stdio.h>
#include <math.h>
#include <iomanip>
#include <queue>
#include <string.h>
#include <string>
using namespace std;
#define fio ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL)
#define ll long long
#define endl "\n"
#define lb lower_bound
#define ub upper_bound
#define fo(i,a,b) for(i=a;i<=b;i++)
#define all(v) (v).begin(),(v).end()
#define sort0(v) sort(all(v))
#define lbb(a,b,arr,x) lower_bound(arr+a,arr+b+1,x)-arr
#define ubb(a,b,arr,x) upper_bound(arr+a,arr+b+1,x)-arr
#define freq(a,b,arr,x) upper_bound(arr+a,arr+b+1,x)-lower_bound(arr+a,arr+b+1,x)
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
#define d0(x) cout<<(x)<<" "
#define d1(x) cout<<(x)<<endl
#define d2(x,y) cout<<(x)<<" "<<(y)<<endl
#define d3(x,y,z) cout<<(x)<<" "<<(y)<<" "<<(z)<<endl
#define d4(a,b,c,d) cout<<(a)<<" "<<(b)<<" "<<(c)<<" "<<(d)<<endl
#define d5(a,b,c,d,e) cout<<(a)<<" "<<(b)<<" "<<(c)<<" "<<(d)<<" "<<(e)<<endl
#define d6(a,b,c,d,e,f) cout<<(a)<<" "<<(b)<<" "<<(c)<<" "<<(d)<<" "<<(e)<<" "<<(f)<<endl
#define max3(a,b,c) max(max((a),(b)),(c))
#define max4(a,b,c,d) max(max((a),(b)),max((c),(d)))
#define ss second
#define ff first
#define pb push_back
#define mp make_pair
#define printp(x) cout << x.ff << " " << x.ss << endl

const ll mod=998244353;
#define inf 9999999999999
#define MAXN   100001

// stores smallest prime factor for every number

ll inv(ll i){if(i==1) return 1;return (mod-((mod/i)*inv(mod%i))%mod)%mod;}

ll gcd(ll a,ll b){if(a==0) return b;return gcd(b,b%a);}
inline void fastio(){ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);}
// Template ends
const int MN = 2e5+7;
int n,a,b,da,db;
int depth[100001]; bool vis[100001];
void dfs(vector <int> adj[], int x){
    queue <int> q;
    vis[x]=true;
    q.push(x);
    while(q.size()>0){
        int s=q.front();
        q.pop();
        for(int i=0;i<adj[s].size();i++){
            if(!vis[adj[s][i]]){
                vis[adj[s][i]]=true;
                depth[adj[s][i]]=1+depth[s];
                q.push(adj[s][i]);
            }
        }
    }
}
void solve(){
    cin>>n>>a>>b>>da>>db;
    vector <int> adj[n];
    for(int i=0;i<n;i++) {
        depth[i]=0;
        vis[i]=false;
    }
    for(int i=0;i<n-1;i++){
        int a,b; cin>>a>>b;
        adj[a-1].pb(b-1);
        adj[b-1].pb(a-1);
    }
    int min_dist=2*da+1;
    if(db<min_dist){
        cout<<"Alice"<<endl;
        return;
    }
    dfs(adj, b-1);
    if(depth[a-1]<=da){
        cout<<"Alice"<<endl;
        return;
    }
    int max_dist=0;
    for(int i=0;i<n;i++){
        max_dist=max(max_dist,depth[i]);
    }
    if(max_dist>=min_dist){
        cout<<"Bob"<<endl;
    }else{
        cout<<"Alice"<<endl;
    }
    return;
}
int main(){
    fastio();
    //write code
    int t; cin>>t;
    while(t--){
        solve();
    }
    return 0;
}


// Template begins
#include <iostream>
#include <algorithm>
#include <vector>
#include <map>
#include <set>
#include <stdio.h>
#include <math.h>
#include <iomanip>
#include <queue>
#include <string.h>
#include <string>
using namespace std;
#define fio ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL)
#define ll long long
#define endl "\n"
#define lb lower_bound
#define ub upper_bound
#define fo(i,a,b) for(i=a;i<=b;i++)
#define all(v) (v).begin(),(v).end()
#define sort0(v) sort(all(v))
#define lbb(a,b,arr,x) lower_bound(arr+a,arr+b+1,x)-arr
#define ubb(a,b,arr,x) upper_bound(arr+a,arr+b+1,x)-arr
#define freq(a,b,arr,x) upper_bound(arr+a,arr+b+1,x)-lower_bound(arr+a,arr+b+1,x)
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
#define d0(x) cout<<(x)<<" "
#define d1(x) cout<<(x)<<endl
#define d2(x,y) cout<<(x)<<" "<<(y)<<endl
#define d3(x,y,z) cout<<(x)<<" "<<(y)<<" "<<(z)<<endl
#define d4(a,b,c,d) cout<<(a)<<" "<<(b)<<" "<<(c)<<" "<<(d)<<endl
#define d5(a,b,c,d,e) cout<<(a)<<" "<<(b)<<" "<<(c)<<" "<<(d)<<" "<<(e)<<endl
#define d6(a,b,c,d,e,f) cout<<(a)<<" "<<(b)<<" "<<(c)<<" "<<(d)<<" "<<(e)<<" "<<(f)<<endl
#define max3(a,b,c) max(max((a),(b)),(c))
#define max4(a,b,c,d) max(max((a),(b)),max((c),(d)))
#define ss second
#define ff first
#define pb push_back
#define mp make_pair
#define printp(x) cout << x.ff << " " << x.ss << endl

const ll mod=998244353;
#define inf 9999999999999
#define MAXN   100001

// stores smallest prime factor for every number

ll inv(ll i){if(i==1) return 1;return (mod-((mod/i)*inv(mod%i))%mod)%mod;}

ll gcd(ll a,ll b){if(a==0) return b;return gcd(b,b%a);}
inline void fastio(){ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);}
// Template ends
const int MN = 2e5+7;
int n,a,b,da,db;
int depth[100001]; bool vis[100001];
void dfs(vector <int> adj[], int x){
    queue <int> q;
    vis[x]=true;
    q.push(x);
    while(q.size()>0){
        int s=q.front();
        q.pop();
        for(int i=0;i<adj[s].size();i++){
            if(!vis[adj[s][i]]){
                vis[adj[s][i]]=true;
                depth[adj[s][i]]=1+depth[s];
                q.push(adj[s][i]);
            }
        }
    }
}
void solve(){
    cin>>n>>a>>b>>da>>db;
    vector <int> adj[n];
    for(int i=0;i<n;i++) {
        depth[i]=0;
        vis[i]=false;
    }
    for(int i=0;i<n-1;i++){
        int a,b; cin>>a>>b;
        adj[a-1].pb(b-1);
        adj[b-1].pb(a-1);
    }
    int min_dist=2*da+1;
    dfs(adj, b-1);
    if(depth[a-1]<=da){
        cout<<"Alice"<<endl;
        return;
    }
    if(db<min_dist){
        cout<<"Alice"<<endl;
        return;
    }
    int mi=0;
    for(int i=0;i<n;i++){
        if(depth[mi]<depth[i]) mi=i;
    }
    int store=depth[mi];
    for(int i=0;i<n;i++) {
        depth[i]=0;
        vis[i]=false;
    }
    dfs(adj, mi); int mval=0;
    for(int i=0;i<n;i++){
        mval=max(mval,depth[i]);
    }
    //it is necessary to check the length of the diameter because and not the farthest point. It is so because BOB can make it to the safe spot on the diamter
    // in less than 2*da+1 moves. So if the farthest spot is less than 2*da+1 it doesnot mean that BOB cant win.
    // We have to ensure there is enough space(i.e. 2*da+1 atleast) on the diameter for BOB to jump around avoiding ALICE.
    if(mval>=min_dist ){
        cout<<"Bob"<<endl;
    }else{
        cout<<"Alice"<<endl;
    }
    return;
}
int main(){
    fastio();
    //write code
    int t; cin>>t;
    while(t--){
        solve();
    }
    return 0;
}


// Template begins
#include <iostream>
#include <algorithm>
#include <vector>
#include <map>
#include <set>
#include <stdio.h>
#include <math.h>
#include <iomanip>
#include <queue>
#include <string.h>
#include <string>
using namespace std;
#define fio ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL)
#define ll long long
#define endl "\n"
#define lb lower_bound
#define ub upper_bound
#define fo(i,a,b) for(i=a;i<=b;i++)
#define all(v) (v).begin(),(v).end()
#define sort0(v) sort(all(v))
#define lbb(a,b,arr,x) lower_bound(arr+a,arr+b+1,x)-arr
#define ubb(a,b,arr,x) upper_bound(arr+a,arr+b+1,x)-arr
#define freq(a,b,arr,x) upper_bound(arr+a,arr+b+1,x)-lower_bound(arr+a,arr+b+1,x)
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
#define d0(x) cout<<(x)<<" "
#define d1(x) cout<<(x)<<endl
#define d2(x,y) cout<<(x)<<" "<<(y)<<endl
#define d3(x,y,z) cout<<(x)<<" "<<(y)<<" "<<(z)<<endl
#define d4(a,b,c,d) cout<<(a)<<" "<<(b)<<" "<<(c)<<" "<<(d)<<endl
#define d5(a,b,c,d,e) cout<<(a)<<" "<<(b)<<" "<<(c)<<" "<<(d)<<" "<<(e)<<endl
#define d6(a,b,c,d,e,f) cout<<(a)<<" "<<(b)<<" "<<(c)<<" "<<(d)<<" "<<(e)<<" "<<(f)<<endl
#define max3(a,b,c) max(max((a),(b)),(c))
#define max4(a,b,c,d) max(max((a),(b)),max((c),(d)))
#define ss second
#define ff first
#define pb push_back
#define mp make_pair
#define printp(x) cout << x.ff << " " << x.ss << endl

const ll mod=998244353;
#define inf 9999999999999
#define MAXN   100001

// stores smallest prime factor for every number

ll inv(ll i){if(i==1) return 1;return (mod-((mod/i)*inv(mod%i))%mod)%mod;}

ll gcd(ll a,ll b){if(a==0) return b;return gcd(b,b%a);}
inline void fastio(){ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);}
// Template ends
const int MN = 2e5+7;
int n,a,b,da,db;
int depth[100001]; bool vis[100001];
void dfs(vector <int> adj[], int x){
    queue <int> q;
    vis[x]=true;
    q.push(x);
    while(q.size()>0){
        int s=q.front();
        q.pop();
        for(int i=0;i<adj[s].size();i++){
            if(!vis[adj[s][i]]){
                vis[adj[s][i]]=true;
                depth[adj[s][i]]=1+depth[s];
                q.push(adj[s][i]);
            }
        }
    }
}
void solve(){
    cin>>n>>a>>b>>da>>db;
    vector <int> adj[n];
    for(int i=0;i<n;i++) {
        depth[i]=0;
        vis[i]=false;
    }
    for(int i=0;i<n-1;i++){
        int a,b; cin>>a>>b;
        adj[a-1].pb(b-1);
        adj[b-1].pb(a-1);
    }
    int min_dist=2*da+1;
    dfs(adj, b-1);
    if(depth[a-1]<=da){
        cout<<"Alice"<<endl;
        return;
    }
    if(db<min_dist){
        cout<<"Alice"<<endl;
        return;
    }
    int mi=0;
    for(int i=0;i<n;i++){
        if(depth[mi]<depth[i]) mi=i;
    }
    int store=depth[mi];
    for(int i=0;i<n;i++) {
        depth[i]=0;
        vis[i]=false;
    }
    dfs(adj, mi); int mval=0;
    for(int i=0;i<n;i++){
        mval=max(mval,depth[i]);
    }
    //it is necessary to check the length of the diameter because and not the farthest point. It is so because BOB can make it to the safe spot on the diamter
    // in less than 2*da+1 moves. So if the farthest spot is less than 2*da+1 it doesnot mean that BOB cant win.
    // We have to ensure there is enough space(i.e. 2*da+1 atleast) on the diameter for BOB to jump around avoiding ALICE.
    if(mval>=min_dist && store>da){
        cout<<"Bob"<<endl;
    }else{
        cout<<"Alice"<<endl;
    }
    return;
}
int main(){
    fastio();
    //write code
    int t; cin>>t;
    while(t--){
        solve();
    }
    return 0;
}


// Template begins
#include <iostream>
#include <algorithm>
#include <vector>
#include <map>
#include <set>
#include <stdio.h>
#include <math.h>
#include <iomanip>
#include <queue>
#include <string.h>
#include <string>
using namespace std;
#define fio ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL)
#define ll long long
#define endl "\n"
#define lb lower_bound
#define ub upper_bound
#define fo(i,a,b) for(i=a;i<=b;i++)
#define all(v) (v).begin(),(v).end()
#define sort0(v) sort(all(v))
#define lbb(a,b,arr,x) lower_bound(arr+a,arr+b+1,x)-arr
#define ubb(a,b,arr,x) upper_bound(arr+a,arr+b+1,x)-arr
#define freq(a,b,arr,x) upper_bound(arr+a,arr+b+1,x)-lower_bound(arr+a,arr+b+1,x)
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
#define d0(x) cout<<(x)<<" "
#define d1(x) cout<<(x)<<endl
#define d2(x,y) cout<<(x)<<" "<<(y)<<endl
#define d3(x,y,z) cout<<(x)<<" "<<(y)<<" "<<(z)<<endl
#define d4(a,b,c,d) cout<<(a)<<" "<<(b)<<" "<<(c)<<" "<<(d)<<endl
#define d5(a,b,c,d,e) cout<<(a)<<" "<<(b)<<" "<<(c)<<" "<<(d)<<" "<<(e)<<endl
#define d6(a,b,c,d,e,f) cout<<(a)<<" "<<(b)<<" "<<(c)<<" "<<(d)<<" "<<(e)<<" "<<(f)<<endl
#define max3(a,b,c) max(max((a),(b)),(c))
#define max4(a,b,c,d) max(max((a),(b)),max((c),(d)))
#define ss second
#define ff first
#define pb push_back
#define mp make_pair
#define printp(x) cout << x.ff << " " << x.ss << endl

const ll mod=998244353;
#define inf 9999999999999
#define MAXN   100001

// stores smallest prime factor for every number

ll inv(ll i){if(i==1) return 1;return (mod-((mod/i)*inv(mod%i))%mod)%mod;}

ll gcd(ll a,ll b){if(a==0) return b;return gcd(b,b%a);}
inline void fastio(){ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);}
// Template ends
const int MN = 2e5+7;
int n,a,b,da,db;
int depth[100001]; bool vis[100001];
void dfs(vector <int> adj[], int x){
    queue <int> q;
    vis[x]=true;
    q.push(x);
    while(q.size()>0){
        int s=q.front();
        q.pop();
        for(int i=0;i<adj[s].size();i++){
            if(!vis[adj[s][i]]){
                vis[adj[s][i]]=true;
                depth[adj[s][i]]=1+depth[s];
                q.push(adj[s][i]);
            }
        }
    }
}
void solve(){
    cin>>n>>a>>b>>da>>db;
    vector <int> adj[n];
    for(int i=0;i<n;i++) {
        depth[i]=0;
        vis[i]=false;
    }
    for(int i=0;i<n-1;i++){
        int a,b; cin>>a>>b;
        adj[a-1].pb(b-1);
        adj[b-1].pb(a-1);
    }
    int min_dist=2*da+1;
    dfs(adj, b-1);
    if(depth[a-1]<=da){
        cout<<"Alice"<<endl;
        return;
    }
    if(db<min_dist){
        cout<<"Alice"<<endl;
        return;
    }
    int max_dist=0;
    for(int i=0;i<n;i++){
        max_dist=max(max_dist,depth[i]);
    }
    if(depth[a-1]>=min_dist){
        cout<<"Bob"<<endl;
        return;
    }
    if(max_dist>=min_dist){
        cout<<"Bob"<<endl;
    }else{
        cout<<"Alice"<<endl;
    }
    return;
}
int main(){
    fastio();
    //write code
    int t; cin>>t;
    while(t--){
        solve();
    }
    return 0;
}


// Template begins
#include <iostream>
#include <algorithm>
#include <vector>
#include <map>
#include <set>
#include <stdio.h>
#include <math.h>
#include <iomanip>
#include <queue>
#include <string.h>
#include <string>
using namespace std;
#define fio ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL)
#define ll long long
#define endl "\n"
#define lb lower_bound
#define ub upper_bound
#define fo(i,a,b) for(i=a;i<=b;i++)
#define all(v) (v).begin(),(v).end()
#define sort0(v) sort(all(v))
#define lbb(a,b,arr,x) lower_bound(arr+a,arr+b+1,x)-arr
#define ubb(a,b,arr,x) upper_bound(arr+a,arr+b+1,x)-arr
#define freq(a,b,arr,x) upper_bound(arr+a,arr+b+1,x)-lower_bound(arr+a,arr+b+1,x)
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
#define d0(x) cout<<(x)<<" "
#define d1(x) cout<<(x)<<endl
#define d2(x,y) cout<<(x)<<" "<<(y)<<endl
#define d3(x,y,z) cout<<(x)<<" "<<(y)<<" "<<(z)<<endl
#define d4(a,b,c,d) cout<<(a)<<" "<<(b)<<" "<<(c)<<" "<<(d)<<endl
#define d5(a,b,c,d,e) cout<<(a)<<" "<<(b)<<" "<<(c)<<" "<<(d)<<" "<<(e)<<endl
#define d6(a,b,c,d,e,f) cout<<(a)<<" "<<(b)<<" "<<(c)<<" "<<(d)<<" "<<(e)<<" "<<(f)<<endl
#define max3(a,b,c) max(max((a),(b)),(c))
#define max4(a,b,c,d) max(max((a),(b)),max((c),(d)))
#define ss second
#define ff first
#define pb push_back
#define mp make_pair
#define printp(x) cout << x.ff << " " << x.ss << endl

const ll mod=998244353;
#define inf 9999999999999
#define MAXN   100001

// stores smallest prime factor for every number

ll inv(ll i){if(i==1) return 1;return (mod-((mod/i)*inv(mod%i))%mod)%mod;}

ll gcd(ll a,ll b){if(a==0) return b;return gcd(b,b%a);}
inline void fastio(){ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);}
// Template ends
const int MN = 2e5+7;
int n,a,b,da,db;
int depth[100001]; bool vis[100001];
void dfs(vector <int> adj[], int x){
    queue <int> q;
    vis[x]=true;
    q.push(x);
    while(q.size()>0){
        int s=q.front();
        q.pop();
        for(int i=0;i<adj[s].size();i++){
            if(!vis[adj[s][i]]){
                vis[adj[s][i]]=true;
                depth[adj[s][i]]=1+depth[s];
                q.push(adj[s][i]);
            }
        }
    }
}
void solve(){
    cin>>n>>a>>b>>da>>db;
    vector <int> adj[n];
    for(int i=0;i<n;i++) {
        depth[i]=0;
        vis[i]=false;
    }
    for(int i=0;i<n-1;i++){
        int a,b; cin>>a>>b;
        adj[a-1].pb(b-1);
        adj[b-1].pb(a-1);
    }
    int min_dist=2*da+1;
    dfs(adj, b-1);
    if(depth[a-1]<=da){
        cout<<"Alice"<<endl;
        return;
    }
    if(db<min_dist){
        cout<<"Alice"<<endl;
        return;
    }
    int mi=0;
    for(int i=0;i<n;i++){
        if(depth[mi]<depth[i]) mi=i;
    }
    int store=depth[mi];
    for(int i=0;i<n;i++) {
        depth[i]=0;
        vis[i]=false;
    }
    dfs(adj, mi); int mval=0;
    for(int i=0;i<n;i++){
        mval=max(mval,depth[i]);
    }
    //it is necessary to check the length of the diameter because and not the farthest point. It is so because BOB can make it to the safe spot on the diamter
    // in less than 2*da+1 moves. So if the farthest spot is less than 2*da+1 it doesnot mean that BOB cant win.
    // We have to ensure there is enough space(i.e. 2*da+1 atleast) on the diameter for BOB to jump around avoiding ALICE.
    if(mval>=min_dist && store>da+1){
        cout<<"Bob"<<endl;
    }else{
        cout<<"Alice"<<endl;
    }
    return;
}
int main(){
    fastio();
    //write code
    int t; cin>>t;
    while(t--){
        solve();
    }
    return 0;
}


// Template begins
#include <iostream>
#include <algorithm>
#include <vector>
#include <map>
#include <set>
#include <stdio.h>
#include <math.h>
#include <iomanip>
#include <queue>
#include <string.h>
#include <string>
using namespace std;
#define fio ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL)
#define ll long long
#define endl "\n"
#define lb lower_bound
#define ub upper_bound
#define fo(i,a,b) for(i=a;i<=b;i++)
#define all(v) (v).begin(),(v).end()
#define sort0(v) sort(all(v))
#define lbb(a,b,arr,x) lower_bound(arr+a,arr+b+1,x)-arr
#define ubb(a,b,arr,x) upper_bound(arr+a,arr+b+1,x)-arr
#define freq(a,b,arr,x) upper_bound(arr+a,arr+b+1,x)-lower_bound(arr+a,arr+b+1,x)
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
#define d0(x) cout<<(x)<<" "
#define d1(x) cout<<(x)<<endl
#define d2(x,y) cout<<(x)<<" "<<(y)<<endl
#define d3(x,y,z) cout<<(x)<<" "<<(y)<<" "<<(z)<<endl
#define d4(a,b,c,d) cout<<(a)<<" "<<(b)<<" "<<(c)<<" "<<(d)<<endl
#define d5(a,b,c,d,e) cout<<(a)<<" "<<(b)<<" "<<(c)<<" "<<(d)<<" "<<(e)<<endl
#define d6(a,b,c,d,e,f) cout<<(a)<<" "<<(b)<<" "<<(c)<<" "<<(d)<<" "<<(e)<<" "<<(f)<<endl
#define max3(a,b,c) max(max((a),(b)),(c))
#define max4(a,b,c,d) max(max((a),(b)),max((c),(d)))
#define ss second
#define ff first
#define pb push_back
#define mp make_pair
#define printp(x) cout << x.ff << " " << x.ss << endl

const ll mod=998244353;
#define inf 9999999999999
#define MAXN   100001

// stores smallest prime factor for every number

ll inv(ll i){if(i==1) return 1;return (mod-((mod/i)*inv(mod%i))%mod)%mod;}

ll gcd(ll a,ll b){if(a==0) return b;return gcd(b,b%a);}
inline void fastio(){ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);}
// Template ends
const int MN = 2e5+7;
int n,a,b,da,db;
int depth[100001]; bool vis[100001];
void dfs(vector <int> adj[], int x){
    vis[x]=true;
    for(int i=0;i<adj[x].size();i++){
        if(!vis[adj[x][i]]){
            depth[adj[x][i]]=1+depth[x];
            dfs(adj, adj[x][i]);

        }

    }
}
void solve(){
    cin>>n>>a>>b>>da>>db;
    vector <int> adj[n];
    for(int i=0;i<n;i++) {
        depth[i]=0;
        vis[i]=false;
    }
    for(int i=0;i<n-1;i++){
        int a,b; cin>>a>>b;
        adj[a-1].pb(b-1);
        adj[b-1].pb(a-1);
    }
    int min_dist=2*da+1;
    if(db<min_dist){
        cout<<"Alice"<<endl;
        return;
    }
    dfs(adj, b-1);
    if(depth[a-1]<=da){
        cout<<"Alice"<<endl;
        return;
    }
    int max_dist=0;
    for(int i;i<n;i++){
        max_dist=max(max_dist,depth[i]);
    }
    if(max_dist>=min_dist){
        cout<<"Bob"<<endl;
    }else{
        cout<<"Alice"<<endl;
    }
    return;
}
int main(){
    fastio();
    //write code
    int t; cin>>t;
    while(t--){
        solve();
    }
    return 0;
}


/*In Case of TLE -> 1.Use Int instead of Long Long
                    2.Use FastIO
                    3.Use "\n" Instead of endl
                    4.Use Vector and Arrays instead of Sets,Maps(if possible)
*/
#include<bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp> //required
#include <ext/pb_ds/tree_policy.hpp> //required
#define pb push_back
#define pf push_front
#define all(x) (x).begin(),(x).end()
#define rall(x) (x).rbegin(),(x).rend()
#define distinct(x) sort(all(x)); x.resize(unique(all(x))-x.begin());
#define sz(x)  (long long)(x).size()
#define sqr(x) (x)*(x)
#define sof sizeof
#define resz resize
#define ins insert
#define lowerB lower_bound
#define upperB upper_bound
#define mkp make_pair
#define mkt make_tuple
#define act(a,v) (get<(long long)a>(v))
#define mod 1000000007
#define mod1 998244353
#define N 1000003  //N idhar hai
#define inf 1e18
#define minf -1e18
#define min3(a,b,c) min(a,min(b,c))
#define max3(a,b,c) max(a,max(b,c))
#define ms(dp,a) memset(dp,(ll)a,sof(dp))
#define Foreach(i, c) for(__typeof((c).begin()) i = (c).begin(); i != (c).end(); ++i)
#define fr(i,b) for(int (i)=(0);(i) < (b); ++(i))
#define For(i,a,b) for(int (i)=(a);(i) < (b); ++(i))
#define rof(i,a,b) for(int (i)=(a);(i) >= (b); --(i))
#define rep(i, c) for(auto &(i) : (c))
#define FastIO ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL)
#define PRECISION(n) std::cout.unsetf ( std::ios::floatfield );std::cout.precision((ll)n)
#define getsm(v) accumulate(all(v),(ll)0)
#define getmx(v) max_element(all(v))
#define getmn(v) min_element(all(v))
#define ws1(a) cout<<(a)<<" "
#define wr1(a) cout<<(a)<<endl
#define wr2(a,b) cout<<(a)<<" "<<(b)<<endl
#define wr3(a,b,c) cout<<(a)<<" "<<(b)<<" "<<(c)<<endl
#define wr4(a,b,c,d) cout<<(a)<<" "<<(b)<<" "<<(c)<<" "<<(d)<<endl
#define ww1(a) cout<<(a)<<"\n"
#define ww2(a,b) cout<<(a)<<" "<<(b)<<"\n"
#define ww3(a,b,c) cout<<(a)<<" "<<(b)<<" "<<(c)<<"\n"
#define ww4(a,b,c,d) cout<<(a)<<" "<<(b)<<" "<<(c)<<" "<<(d)<<"\n"
#define FileIO freopen("input.txt","r",stdin);freopen("output.txt","w",stdout)
#define fill(dp,a,b) for(int i=0;i<a;i++)for(int j=0;j<b;j++)dp[i][j]=-1;
#define PI 3.14159265358979323846264338327950288419716939937510
#define fi first
#define se second
#define here cout<<"RSSB"<<endl
#define dbg cout<<"Krishna"<<endl
#define showzero cout<<std::showpoint
#define bitcount( x ) __builtin_popcountll( x )
#define ls(i) (1ll<<(i))
using namespace __gnu_pbds; //required
using namespace  std ;
//typedef double db;
typedef int ll ; //long long
typedef vector<int>vi ;
//typedef vector<l>vl ;
typedef vector<ll>vll ;
typedef vector<vector<ll> >vvl ;
typedef pair<int,int> pii ;
typedef pair<ll,ll> pll ;
typedef vector<pll>vpll;
typedef vector<string>vstr;
typedef vector<bool>vbool ;
template <typename T> using ordered_set =  tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
void READ(vll &v, ll n){ll a ;for(ll i=0 ; i<n ; i=i+1){cin>>a ;v.pb(a);}}
void PRINT(vll &v , ll a = 0){for(ll i=a ; i<v.size() ; i=i+1){/*v[i] = max((ll)0,v[i]);*/cout<<v[i]<<" " ;}cout<<"\n" ;}
//double logy(ll n , ll b){if(b==0){return(-1);}if(n==1){return(0);}return((db)log10(n)/log10(b));}
long long power(long long k , long long n , long long m=mod){long long res = 1;while(n){if(n%2!=0){res = (res*k)%m ;}k = (k*k)%m ;n = n/2 ;}return(res) ;}
double powerD(double k , long long n ){double res = 1;while(n){if(n%2!=0){res = (res*k) ;}k = (k*k) ;n = n/2 ;}return(res) ;}
ll gcdExtend(ll a , ll b , ll &x , ll &y){if(a==0){x = 0;y = 1;return(b);}ll x1,y1;ll g = gcdExtend(b%a,a,x1,y1);x = y1 - (b/a)*x1;y = x1;return(g);}
ll gcd(ll a, ll b) { return b ? gcd(b, a%b) : a; }
#define lcm(a,b) ((a/gcd(a,b))*b)
ll n,m,k,h,a1,a2,a3;
//db prob;
string str;
bool ok = true;
void go(ll a = 1)
{
    if(a)
    {
        ww1("Alice");
    }
    else
    {
        ww1("Bob");
    }
}
vvl v;
vll dis,pa;
ll da,db;
void dfs(ll i , ll x , ll par)
{
    pa[i] = par;
    dis[i] = x;
    for(auto j : v[i])
    {
        if(j!=par)
        {
            dfs(j,x+1,i);
        }
    }
}
void dfs1(ll i)
{
    ll y = i;
    ll d = dis[a2] - dis[y];
    ll c1 = dis[y];
    ll c2 = (d+db-1)/db;
    c1 = (dis[y]+da-1)/da;
    if(c2<c1-1)
    {
        d = dis[i]%da;
        if(d==0)
        {
            d = da;
        }
        ok&=(d>=db-da);
    }
    for(auto j : v[i])
    {
        if(j!=pa[i])
        {
            dfs1(j);
        }
    }
}
void solveIt()
{
    ll a,b,c,d,i,j,x,y,z,t;
    ll p,q,w,r;
    string str1,str2;
    char ch;
    cin>>t;
    while(t--)
    {
        cin>>n>>a>>b>>da>>db;
        a1 = a;
        a2 = b;
        v.clear();
        v.resz(n+1);
        dis.clear();
        dis.resz(n+1);
        pa.clear();
        pa.resz(n+1);
        for(i=0 ; i<n-1 ; i++)
        {
            cin>>c>>d;
            v[c].pb(d);
            v[d].pb(c);
        }
        if(db<=da)
        {
            go();
            continue;
        }
        dfs(a,0,a);
        if(dis[b]<=da)
        {
            go();
            continue;
        }
        if(db>2*da)
        {
            go(0);
            continue;
        }
        ok = true;
        y = b;
        z = y;
        while(true)
        {
            d = dis[b] - dis[y];
            ll c1 = dis[y];
            ll c2 = (d+db-1)/db;
            c1 = (dis[y]+da-1)/da;
            if(c2<c1-1)
            {
                z = y;
                y = pa[y];
            }
            else
            {
                y = z;
                break;
            }
        }
        dfs1(y);
        go(ok);
    }
}
int main()
{
#ifndef ONLINE_JUDGE
        freopen("Rinput.txt", "r", stdin);
        freopen("Routput.txt", "w", stdout);
#endif
    FastIO;
    PRECISION(12);
    //FileIO;
    //dr.pb(mkp(0,1));dr.pb(mkp(1,0));dr.pb(mkp(0,-1));dr.pb(mkp(-1,0));
    ll t = 1;
    //cin>>t;
    while(t--)
    {
        solveIt();
    }
    //WhateverItTakes
    //FOCUS
    //BeABelieverWarrior
    //DO IT UNTIL YOU RUN OUT OF IDEAS ~ YOU KNOW WHO
    //See The Editorial Almost Never ~ YOU KNOW WHO
}


/*In Case of TLE -> 1.Use Int instead of Long Long
                    2.Use FastIO
                    3.Use "\n" Instead of endl
                    4.Use Vector and Arrays instead of Sets,Maps(if possible)
*/
#include<bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp> //required
#include <ext/pb_ds/tree_policy.hpp> //required
#define pb push_back
#define pf push_front
#define all(x) (x).begin(),(x).end()
#define rall(x) (x).rbegin(),(x).rend()
#define distinct(x) sort(all(x)); x.resize(unique(all(x))-x.begin());
#define sz(x)  (long long)(x).size()
#define sqr(x) (x)*(x)
#define sof sizeof
#define resz resize
#define ins insert
#define lowerB lower_bound
#define upperB upper_bound
#define mkp make_pair
#define mkt make_tuple
#define act(a,v) (get<(long long)a>(v))
#define mod 1000000007
#define mod1 998244353
#define N 1000003  //N idhar hai
#define inf 1e18
#define minf -1e18
#define min3(a,b,c) min(a,min(b,c))
#define max3(a,b,c) max(a,max(b,c))
#define ms(dp,a) memset(dp,(ll)a,sof(dp))
#define Foreach(i, c) for(__typeof((c).begin()) i = (c).begin(); i != (c).end(); ++i)
#define fr(i,b) for(int (i)=(0);(i) < (b); ++(i))
#define For(i,a,b) for(int (i)=(a);(i) < (b); ++(i))
#define rof(i,a,b) for(int (i)=(a);(i) >= (b); --(i))
#define rep(i, c) for(auto &(i) : (c))
#define FastIO ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL)
#define PRECISION(n) std::cout.unsetf ( std::ios::floatfield );std::cout.precision((ll)n)
#define getsm(v) accumulate(all(v),(ll)0)
#define getmx(v) max_element(all(v))
#define getmn(v) min_element(all(v))
#define ws1(a) cout<<(a)<<" "
#define wr1(a) cout<<(a)<<endl
#define wr2(a,b) cout<<(a)<<" "<<(b)<<endl
#define wr3(a,b,c) cout<<(a)<<" "<<(b)<<" "<<(c)<<endl
#define wr4(a,b,c,d) cout<<(a)<<" "<<(b)<<" "<<(c)<<" "<<(d)<<endl
#define ww1(a) cout<<(a)<<"\n"
#define ww2(a,b) cout<<(a)<<" "<<(b)<<"\n"
#define ww3(a,b,c) cout<<(a)<<" "<<(b)<<" "<<(c)<<"\n"
#define ww4(a,b,c,d) cout<<(a)<<" "<<(b)<<" "<<(c)<<" "<<(d)<<"\n"
#define FileIO freopen("input.txt","r",stdin);freopen("output.txt","w",stdout)
#define fill(dp,a,b) for(int i=0;i<a;i++)for(int j=0;j<b;j++)dp[i][j]=-1;
#define PI 3.14159265358979323846264338327950288419716939937510
#define fi first
#define se second
#define here cout<<"RSSB"<<endl
#define dbg cout<<"Krishna"<<endl
#define showzero cout<<std::showpoint
#define bitcount( x ) __builtin_popcountll( x )
#define ls(i) (1ll<<(i))
using namespace __gnu_pbds; //required
using namespace  std ;
//typedef double db;
typedef int ll ; //long long
typedef vector<int>vi ;
//typedef vector<l>vl ;
typedef vector<ll>vll ;
typedef vector<vector<ll> >vvl ;
typedef pair<int,int> pii ;
typedef pair<ll,ll> pll ;
typedef vector<pll>vpll;
typedef vector<string>vstr;
typedef vector<bool>vbool ;
template <typename T> using ordered_set =  tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
void READ(vll &v, ll n){ll a ;for(ll i=0 ; i<n ; i=i+1){cin>>a ;v.pb(a);}}
void PRINT(vll &v , ll a = 0){for(ll i=a ; i<v.size() ; i=i+1){/*v[i] = max((ll)0,v[i]);*/cout<<v[i]<<" " ;}cout<<"\n" ;}
//double logy(ll n , ll b){if(b==0){return(-1);}if(n==1){return(0);}return((db)log10(n)/log10(b));}
long long power(long long k , long long n , long long m=mod){long long res = 1;while(n){if(n%2!=0){res = (res*k)%m ;}k = (k*k)%m ;n = n/2 ;}return(res) ;}
double powerD(double k , long long n ){double res = 1;while(n){if(n%2!=0){res = (res*k) ;}k = (k*k) ;n = n/2 ;}return(res) ;}
ll gcdExtend(ll a , ll b , ll &x , ll &y){if(a==0){x = 0;y = 1;return(b);}ll x1,y1;ll g = gcdExtend(b%a,a,x1,y1);x = y1 - (b/a)*x1;y = x1;return(g);}
ll gcd(ll a, ll b) { return b ? gcd(b, a%b) : a; }
#define lcm(a,b) ((a/gcd(a,b))*b)
ll n,m,k,h,a1,a2,a3;
//db prob;
string str;
bool ok = true;
void go(ll a = 1)
{
    if(a)
    {
        ww1("Alice");
    }
    else
    {
        ww1("Bob");
    }
}
vvl v;
vll dis,pa;
ll da,db;
void dfs(ll i , ll x , ll par)
{
    pa[i] = par;
    dis[i] = x;
    for(auto j : v[i])
    {
        if(j!=par)
        {
            dfs(j,x+1,i);
        }
    }
}
void dfs1(ll i)
{
    ll d = dis[i]%da;
    if(d==0)
    {
        d = da;
    }
    ok&=(d>=db-da);
    for(auto j : v[i])
    {
        if(j!=pa[i])
        {
            dfs1(j);
        }
    }
}
void solveIt()
{
    ll a,b,c,d,i,j,x,y,z,t;
    ll p,q,w,r;
    string str1,str2;
    char ch;
    cin>>t;
    while(t--)
    {
        cin>>n>>a>>b>>da>>db;
        v.clear();
        v.resz(n+1);
        dis.clear();
        dis.resz(n+1);
        pa.clear();
        pa.resz(n+1);
        for(i=0 ; i<n-1 ; i++)
        {
            cin>>c>>d;
            v[c].pb(d);
            v[d].pb(c);
        }
        if(db<=da)
        {
            go();
            continue;
        }
        dfs(a,0,a);
        if(dis[b]<=da)
        {
            go();
            continue;
        }
        ok = true;
        y = b;
        z = y;
        while(true)
        {
            d = dis[b] - dis[y];
            ll c1 = dis[y];
            ll c2 = (d+db-1)/db;
            c1 = (dis[y]+da-1)/da;
            if(c2<c1-1)
            {
                z = y;
                y = pa[y];
            }
            else
            {
                y = z;
                break;
            }
        }
        dfs1(y);
        go(ok);
    }
}
int main()
{
#ifndef ONLINE_JUDGE
        freopen("Rinput.txt", "r", stdin);
        freopen("Routput.txt", "w", stdout);
#endif
    FastIO;
    PRECISION(12);
    //FileIO;
    //dr.pb(mkp(0,1));dr.pb(mkp(1,0));dr.pb(mkp(0,-1));dr.pb(mkp(-1,0));
    ll t = 1;
    //cin>>t;
    while(t--)
    {
        solveIt();
    }
    //WhateverItTakes
    //FOCUS
    //BeABelieverWarrior
    //DO IT UNTIL YOU RUN OUT OF IDEAS ~ YOU KNOW WHO
    //See The Editorial Almost Never ~ YOU KNOW WHO
}


/*In Case of TLE -> 1.Use Int instead of Long Long
                    2.Use FastIO
                    3.Use "\n" Instead of endl
                    4.Use Vector and Arrays instead of Sets,Maps(if possible)
*/
#include<bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp> //required
#include <ext/pb_ds/tree_policy.hpp> //required
#define pb push_back
#define pf push_front
#define all(x) (x).begin(),(x).end()
#define rall(x) (x).rbegin(),(x).rend()
#define distinct(x) sort(all(x)); x.resize(unique(all(x))-x.begin());
#define sz(x)  (long long)(x).size()
#define sqr(x) (x)*(x)
#define sof sizeof
#define resz resize
#define ins insert
#define lowerB lower_bound
#define upperB upper_bound
#define mkp make_pair
#define mkt make_tuple
#define act(a,v) (get<(long long)a>(v))
#define mod1 1000000007
#define mod 998244353
#define N 100003  //N idhar hai
#define inf 1e18
#define minf -1e18
#define min3(a,b,c) min(a,min(b,c))
#define max3(a,b,c) max(a,max(b,c))
#define ms(dp,a) memset(dp,(ll)a,sof(dp))
#define Foreach(i, c) for(__typeof((c).begin()) i = (c).begin(); i != (c).end(); ++i)
#define fr(i,b) for(int (i)=(0);(i) < (b); ++(i))
#define For(i,a,b) for(int (i)=(a);(i) < (b); ++(i))
#define rof(i,a,b) for(int (i)=(a);(i) >= (b); --(i))
#define rep(i, c) for(auto &(i) : (c))
#define FastIO ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL)
#define PRECISION(n) std::cout.unsetf ( std::ios::floatfield );std::cout.precision((ll)n)
#define getsm(v) accumulate(all(v),(ll)0)
#define getmx(v) max_element(all(v))
#define getmn(v) min_element(all(v))
#define ws1(a) cout<<(a)<<" "
#define wr1(a) cout<<(a)<<endl
#define wr2(a,b) cout<<(a)<<" "<<(b)<<endl
#define wr3(a,b,c) cout<<(a)<<" "<<(b)<<" "<<(c)<<endl
#define wr4(a,b,c,d) cout<<(a)<<" "<<(b)<<" "<<(c)<<" "<<(d)<<endl
#define ww1(a) cout<<(a)<<"\n"
#define ww2(a,b) cout<<(a)<<" "<<(b)<<"\n"
#define ww3(a,b,c) cout<<(a)<<" "<<(b)<<" "<<(c)<<"\n"
#define ww4(a,b,c,d) cout<<(a)<<" "<<(b)<<" "<<(c)<<" "<<(d)<<"\n"
#define FileIO freopen("input.txt","r",stdin);freopen("output.txt","w",stdout)
#define fill(dp,a,b) for(int i=0;i<a;i++)for(int j=0;j<b;j++)dp[i][j]=-1;
#define PI 3.14159265358979323846264338327950288419716939937510
#define fi first
#define se second
#define here cout<<"RSSB"<<endl
#define dbg cout<<"Krishna"<<endl
#define showzero cout<<std::showpoint
#define bitcount( x ) __builtin_popcountll( x )
#define ls(i) (1ll<<(i))
using namespace __gnu_pbds; //required
using namespace  std ;
typedef double db;
typedef int ll ; //long long
typedef vector<int>vi ;
//typedef vector<l>vl ;
typedef vector<ll>vll ;
typedef vector<vector<ll> >vvl ;
typedef pair<int,int> pii ;
typedef pair<ll,ll> pll ;
typedef vector<pll>vpll;
typedef vector<string>vstr;
typedef vector<bool>vbool ;
template <typename T> using ordered_set =  tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
void READ(vll &v, ll n){ll a ;for(ll i=0 ; i<n ; i=i+1){cin>>a ;v.pb(a);}}
void PRINT(vll &v , ll a = 0){for(ll i=a ; i<v.size() ; i=i+1){/*v[i] = max((ll)0,v[i]);*/cout<<v[i]<<" " ;}cout<<"\n" ;}
//double logy(ll n , ll b){if(b==0){return(-1);}if(n==1){return(0);}return((db)log10(n)/log10(b));}
long long power(long long k , long long n , long long m=mod){long long res = 1;while(n){if(n%2!=0){res = (res*k)%m ;}k = (k*k)%m ;n = n/2 ;}return(res) ;}
double powerD(double k , long long n ){double res = 1;while(n){if(n%2!=0){res = (res*k) ;}k = (k*k) ;n = n/2 ;}return(res) ;}
ll gcdExtend(ll a , ll b , ll &x , ll &y){if(a==0){x = 0;y = 1;return(b);}ll x1,y1;ll g = gcdExtend(b%a,a,x1,y1);x = y1 - (b/a)*x1;y = x1;return(g);}
ll gcd(ll a, ll b) { return b ? gcd(b, a%b) : a; }
#define lcm(a,b) ((a/gcd(a,b))*b)
ll n,m,k,h,a1,a2,a3;
//db prob;
string str;
bool ok = true;
vvl v;
vll dis;
pll dfs(ll i , ll x = 0 ,ll par = -1)
{
    if(ok)
    {
        dis[i] = x;
    }
    auto p1 = mkp(0,i);
    for(auto j : v[i])
    {
        if(j!=par)
        {
            auto p2 = dfs(j,x+1,i);
            if(p2.fi+1>p1.fi)
            {
                p1.fi = p2.fi + 1;
                p1.se = p2.se;
            }
        }
    }
    return(p1);
}
void go(ll a = 1)
{
    if(a)
    {
        ww1("Alice");
    }
    else
    {
        ww1("Bob");
    }
}
void solveIt()
{
    ll a,b,c,d,i,j,x,y,z,t;
    ll p,q,w,r;
    string str1,str2;
    char ch;
    cin>>t;
    while(t--)
    {
        cin>>n>>a>>b>>a1>>a2;
        v.clear();
        v.resz(n+1);
        dis.clear();
        dis.resz(n+1);
        for(i=0 ; i<n-1 ; i++)
        {
            cin>>c>>d;
            v[c].pb(d);
            v[d].pb(c);
        }
        ok = true;
        auto p1 = dfs(a);
        ok = false;
        p1 = dfs(p1.se);
        if(dis[b]<=a1)
        {
            go();
            continue;
        }
        if(2*a1>=p1.fi)
        {
            go();
            continue;
        }
        go((a2<=2*a1));
    }
}
int main()
{
#ifndef ONLINE_JUDGE
        freopen("Rinput.txt", "r", stdin);
        freopen("Routput.txt", "w", stdout);
#endif
    FastIO;
    PRECISION(12);
    //FileIO;
    //dr.pb(mkp(0,1));dr.pb(mkp(1,0));dr.pb(mkp(0,-1));dr.pb(mkp(-1,0));
    ll t = 1;
    //cin>>t;
    while(t--)
    {
        solveIt();
    }
    //WhateverItTakes
    //FOCUS
    //BeABelieverWarrior
    //DO IT UNTIL YOU RUN OUT OF IDEAS ~ YOU KNOW WHO
    //See The Editorial Almost Never ~ YOU KNOW WHO
}


/*In Case of TLE -> 1.Use Int instead of Long Long
                    2.Use FastIO
                    3.Use "\n" Instead of endl
                    4.Use Vector and Arrays instead of Sets,Maps(if possible)
*/
#include<bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp> //required
#include <ext/pb_ds/tree_policy.hpp> //required
#define pb push_back
#define pf push_front
#define all(x) (x).begin(),(x).end()
#define rall(x) (x).rbegin(),(x).rend()
#define distinct(x) sort(all(x)); x.resize(unique(all(x))-x.begin());
#define sz(x)  (long long)(x).size()
#define sqr(x) (x)*(x)
#define sof sizeof
#define resz resize
#define ins insert
#define lowerB lower_bound
#define upperB upper_bound
#define mkp make_pair
#define mkt make_tuple
#define act(a,v) (get<(long long)a>(v))
#define mod 1000000007
#define mod1 998244353
#define N 1000003  //N idhar hai
#define inf 1e18
#define minf -1e18
#define min3(a,b,c) min(a,min(b,c))
#define max3(a,b,c) max(a,max(b,c))
#define ms(dp,a) memset(dp,(ll)a,sof(dp))
#define Foreach(i, c) for(__typeof((c).begin()) i = (c).begin(); i != (c).end(); ++i)
#define fr(i,b) for(int (i)=(0);(i) < (b); ++(i))
#define For(i,a,b) for(int (i)=(a);(i) < (b); ++(i))
#define rof(i,a,b) for(int (i)=(a);(i) >= (b); --(i))
#define rep(i, c) for(auto &(i) : (c))
#define FastIO ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL)
#define PRECISION(n) std::cout.unsetf ( std::ios::floatfield );std::cout.precision((ll)n)
#define getsm(v) accumulate(all(v),(ll)0)
#define getmx(v) max_element(all(v))
#define getmn(v) min_element(all(v))
#define ws1(a) cout<<(a)<<" "
#define wr1(a) cout<<(a)<<endl
#define wr2(a,b) cout<<(a)<<" "<<(b)<<endl
#define wr3(a,b,c) cout<<(a)<<" "<<(b)<<" "<<(c)<<endl
#define wr4(a,b,c,d) cout<<(a)<<" "<<(b)<<" "<<(c)<<" "<<(d)<<endl
#define ww1(a) cout<<(a)<<"\n"
#define ww2(a,b) cout<<(a)<<" "<<(b)<<"\n"
#define ww3(a,b,c) cout<<(a)<<" "<<(b)<<" "<<(c)<<"\n"
#define ww4(a,b,c,d) cout<<(a)<<" "<<(b)<<" "<<(c)<<" "<<(d)<<"\n"
#define FileIO freopen("input.txt","r",stdin);freopen("output.txt","w",stdout)
#define fill(dp,a,b) for(int i=0;i<a;i++)for(int j=0;j<b;j++)dp[i][j]=-1;
#define PI 3.14159265358979323846264338327950288419716939937510
#define fi first
#define se second
#define here cout<<"RSSB"<<endl
#define dbg cout<<"Krishna"<<endl
#define showzero cout<<std::showpoint
#define bitcount( x ) __builtin_popcountll( x )
#define ls(i) (1ll<<(i))
using namespace __gnu_pbds; //required
using namespace  std ;
//typedef double db;
typedef long long ll ; //long long
typedef vector<int>vi ;
//typedef vector<l>vl ;
typedef vector<ll>vll ;
typedef vector<vector<ll> >vvl ;
typedef pair<int,int> pii ;
typedef pair<ll,ll> pll ;
typedef vector<pll>vpll;
typedef vector<string>vstr;
typedef vector<bool>vbool ;
template <typename T> using ordered_set =  tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
void READ(vll &v, ll n){ll a ;for(ll i=0 ; i<n ; i=i+1){cin>>a ;v.pb(a);}}
void PRINT(vll &v , ll a = 0){for(ll i=a ; i<v.size() ; i=i+1){/*v[i] = max((ll)0,v[i]);*/cout<<v[i]<<" " ;}cout<<"\n" ;}
//double logy(ll n , ll b){if(b==0){return(-1);}if(n==1){return(0);}return((db)log10(n)/log10(b));}
long long power(long long k , long long n , long long m=mod){long long res = 1;while(n){if(n%2!=0){res = (res*k)%m ;}k = (k*k)%m ;n = n/2 ;}return(res) ;}
double powerD(double k , long long n ){double res = 1;while(n){if(n%2!=0){res = (res*k) ;}k = (k*k) ;n = n/2 ;}return(res) ;}
ll gcdExtend(ll a , ll b , ll &x , ll &y){if(a==0){x = 0;y = 1;return(b);}ll x1,y1;ll g = gcdExtend(b%a,a,x1,y1);x = y1 - (b/a)*x1;y = x1;return(g);}
ll gcd(ll a, ll b) { return b ? gcd(b, a%b) : a; }
#define lcm(a,b) ((a/gcd(a,b))*b)
ll n,m,k,h,a1,a2,a3;
//db prob;
string str;
bool ok = true;
void go(ll a = 1)
{
    if(a)
    {
        ww1("Alice");
    }
    else
    {
        ww1("Bob");
    }
}
vvl v;
vll dis,tmp,pa;
ll da,db;
ll dfs(ll i , ll x , ll par)
{
    pa[i] = par;
    dis[i] = x;
    tmp[i] = x;
    ll y = x;
    for(auto j : v[i])
    {
        if(j!=par)
        {
            y = max(y,dfs(j,x+1,i));
        }
    }
    tmp[i] = y;
    return(y);
}
void dfs1(ll i)
{
    ll d = dis[i]%da;
    if(d==0)
    {
        d = da;
    }
    ok&=(d>=db-da);
    for(auto j : v[i])
    {
        if(j!=pa[i])
        {
            dfs1(j);
        }
    }
}
void solveIt()
{
    ll a,b,c,d,i,j,x,y,z,t;
    ll p,q,w,r;
    string str1,str2;
    char ch;
    cin>>t;
    while(t--)
    {
        cin>>n>>a>>b>>da>>db;
        v.clear();
        v.resz(n+1);
        dis.clear();
        tmp.clear();
        dis.resz(n+1);
        tmp.resz(n+1);
        pa.clear();
        pa.resz(n+1);
        if(db<=da)
        {
            go();
            continue;
        }
        for(i=0 ; i<n-1 ; i++)
        {
            cin>>c>>d;
            v[c].pb(d);
            v[d].pb(c);
        }
        dfs(a,0,a);
        if(dis[b]<=da)
        {
            go();
            continue;
        }
        ok = true;
        y = b;
        z = y;
        while(true)
        {
            d = dis[b] - dis[y];
            ll c1 = dis[y];
            ll c2 = (d+db-1)/db;
            c1 = (dis[y]+da-1)/da;
            if(c2<c1)
            {
                z = y;
                y = pa[y];
            }
            else
            {
                y = z;
                break;
            }
        }
        dfs1(y);
        go(ok);
    }
}
int main()
{
#ifndef ONLINE_JUDGE
        freopen("Rinput.txt", "r", stdin);
        freopen("Routput.txt", "w", stdout);
#endif
    FastIO;
    PRECISION(12);
    //FileIO;
    //dr.pb(mkp(0,1));dr.pb(mkp(1,0));dr.pb(mkp(0,-1));dr.pb(mkp(-1,0));
    ll t = 1;
    //cin>>t;
    while(t--)
    {
        solveIt();
    }
    //WhateverItTakes
    //FOCUS
    //BeABelieverWarrior
    //DO IT UNTIL YOU RUN OUT OF IDEAS ~ YOU KNOW WHO
    //See The Editorial Almost Never ~ YOU KNOW WHO
}


/*In Case of TLE -> 1.Use Int instead of Long Long
                    2.Use FastIO
                    3.Use "\n" Instead of endl
                    4.Use Vector and Arrays instead of Sets,Maps(if possible)
*/
#include<bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp> //required
#include <ext/pb_ds/tree_policy.hpp> //required
#define pb push_back
#define pf push_front
#define all(x) (x).begin(),(x).end()
#define rall(x) (x).rbegin(),(x).rend()
#define distinct(x) sort(all(x)); x.resize(unique(all(x))-x.begin());
#define sz(x)  (long long)(x).size()
#define sqr(x) (x)*(x)
#define sof sizeof
#define resz resize
#define ins insert
#define lowerB lower_bound
#define upperB upper_bound
#define mkp make_pair
#define mkt make_tuple
#define act(a,v) (get<(long long)a>(v))
#define mod 1000000007
#define mod1 998244353
#define N 1000003  //N idhar hai
#define inf 1e18
#define minf -1e18
#define min3(a,b,c) min(a,min(b,c))
#define max3(a,b,c) max(a,max(b,c))
#define ms(dp,a) memset(dp,(ll)a,sof(dp))
#define Foreach(i, c) for(__typeof((c).begin()) i = (c).begin(); i != (c).end(); ++i)
#define fr(i,b) for(int (i)=(0);(i) < (b); ++(i))
#define For(i,a,b) for(int (i)=(a);(i) < (b); ++(i))
#define rof(i,a,b) for(int (i)=(a);(i) >= (b); --(i))
#define rep(i, c) for(auto &(i) : (c))
#define FastIO ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL)
#define PRECISION(n) std::cout.unsetf ( std::ios::floatfield );std::cout.precision((ll)n)
#define getsm(v) accumulate(all(v),(ll)0)
#define getmx(v) max_element(all(v))
#define getmn(v) min_element(all(v))
#define ws1(a) cout<<(a)<<" "
#define wr1(a) cout<<(a)<<endl
#define wr2(a,b) cout<<(a)<<" "<<(b)<<endl
#define wr3(a,b,c) cout<<(a)<<" "<<(b)<<" "<<(c)<<endl
#define wr4(a,b,c,d) cout<<(a)<<" "<<(b)<<" "<<(c)<<" "<<(d)<<endl
#define ww1(a) cout<<(a)<<"\n"
#define ww2(a,b) cout<<(a)<<" "<<(b)<<"\n"
#define ww3(a,b,c) cout<<(a)<<" "<<(b)<<" "<<(c)<<"\n"
#define ww4(a,b,c,d) cout<<(a)<<" "<<(b)<<" "<<(c)<<" "<<(d)<<"\n"
#define FileIO freopen("input.txt","r",stdin);freopen("output.txt","w",stdout)
#define fill(dp,a,b) for(int i=0;i<a;i++)for(int j=0;j<b;j++)dp[i][j]=-1;
#define PI 3.14159265358979323846264338327950288419716939937510
#define fi first
#define se second
#define here cout<<"RSSB"<<endl
#define dbg cout<<"Krishna"<<endl
#define showzero cout<<std::showpoint
#define bitcount( x ) __builtin_popcountll( x )
#define ls(i) (1ll<<(i))
using namespace __gnu_pbds; //required
using namespace  std ;
//typedef double db;
typedef int ll ; //long long
typedef vector<int>vi ;
//typedef vector<l>vl ;
typedef vector<ll>vll ;
typedef vector<vector<ll> >vvl ;
typedef pair<int,int> pii ;
typedef pair<ll,ll> pll ;
typedef vector<pll>vpll;
typedef vector<string>vstr;
typedef vector<bool>vbool ;
template <typename T> using ordered_set =  tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
void READ(vll &v, ll n){ll a ;for(ll i=0 ; i<n ; i=i+1){cin>>a ;v.pb(a);}}
void PRINT(vll &v , ll a = 0){for(ll i=a ; i<v.size() ; i=i+1){/*v[i] = max((ll)0,v[i]);*/cout<<v[i]<<" " ;}cout<<"\n" ;}
//double logy(ll n , ll b){if(b==0){return(-1);}if(n==1){return(0);}return((db)log10(n)/log10(b));}
long long power(long long k , long long n , long long m=mod){long long res = 1;while(n){if(n%2!=0){res = (res*k)%m ;}k = (k*k)%m ;n = n/2 ;}return(res) ;}
double powerD(double k , long long n ){double res = 1;while(n){if(n%2!=0){res = (res*k) ;}k = (k*k) ;n = n/2 ;}return(res) ;}
ll gcdExtend(ll a , ll b , ll &x , ll &y){if(a==0){x = 0;y = 1;return(b);}ll x1,y1;ll g = gcdExtend(b%a,a,x1,y1);x = y1 - (b/a)*x1;y = x1;return(g);}
ll gcd(ll a, ll b) { return b ? gcd(b, a%b) : a; }
#define lcm(a,b) ((a/gcd(a,b))*b)
ll n,m,k,h,a1,a2,a3;
//db prob;
string str;
bool ok = true;
void go(ll a = 1)
{
    if(a)
    {
        ww1("Alice");
    }
    else
    {
        ww1("Bob");
    }
}
vvl v;
vll dis,pa;
ll da,db;
void dfs(ll i , ll x , ll par)
{
    pa[i] = par;
    dis[i] = x;
    for(auto j : v[i])
    {
        if(j!=par)
        {
            dfs(j,x+1,i);
        }
    }
}
void dfs1(ll i)
{
    ll d = dis[i]%da;
    if(d==0)
    {
        d = da;
    }
    ok&=(d>=db-da);
    for(auto j : v[i])
    {
        if(j!=pa[i])
        {
            dfs1(j);
        }
    }
}
void solveIt()
{
    ll a,b,c,d,i,j,x,y,z,t;
    ll p,q,w,r;
    string str1,str2;
    char ch;
    cin>>t;
    while(t--)
    {
        cin>>n>>a>>b>>da>>db;
        v.clear();
        v.resz(n+1);
        dis.clear();
        dis.resz(n+1);
        pa.clear();
        pa.resz(n+1);
        for(i=0 ; i<n-1 ; i++)
        {
            cin>>c>>d;
            v[c].pb(d);
            v[d].pb(c);
        }
        if(db<=da)
        {
            go();
            continue;
        }
        dfs(a,0,a);
        if(dis[b]<=da)
        {
            go();
            continue;
        }
        if(db>2*da)
        {
            go(0);
            continue;
        }
        ok = true;
        y = b;
        z = y;
        while(true)
        {
            d = dis[b] - dis[y];
            ll c1 = dis[y];
            ll c2 = (d+db-1)/db;
            c1 = (dis[y]+da-1)/da;
            if(c2<c1-1)
            {
                z = y;
                y = pa[y];
            }
            else
            {
                y = z;
                break;
            }
        }
        dfs1(y);
        go(ok);
    }
}
int main()
{
#ifndef ONLINE_JUDGE
        freopen("Rinput.txt", "r", stdin);
        freopen("Routput.txt", "w", stdout);
#endif
    FastIO;
    PRECISION(12);
    //FileIO;
    //dr.pb(mkp(0,1));dr.pb(mkp(1,0));dr.pb(mkp(0,-1));dr.pb(mkp(-1,0));
    ll t = 1;
    //cin>>t;
    while(t--)
    {
        solveIt();
    }
    //WhateverItTakes
    //FOCUS
    //BeABelieverWarrior
    //DO IT UNTIL YOU RUN OUT OF IDEAS ~ YOU KNOW WHO
    //See The Editorial Almost Never ~ YOU KNOW WHO
}


/*In Case of TLE -> 1.Use Int instead of Long Long
                    2.Use FastIO
                    3.Use "\n" Instead of endl
                    4.Use Vector and Arrays instead of Sets,Maps(if possible)
*/
#include<bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp> //required
#include <ext/pb_ds/tree_policy.hpp> //required
#define pb push_back
#define pf push_front
#define all(x) (x).begin(),(x).end()
#define rall(x) (x).rbegin(),(x).rend()
#define distinct(x) sort(all(x)); x.resize(unique(all(x))-x.begin());
#define sz(x)  (long long)(x).size()
#define sqr(x) (x)*(x)
#define sof sizeof
#define resz resize
#define ins insert
#define lowerB lower_bound
#define upperB upper_bound
#define mkp make_pair
#define mkt make_tuple
#define act(a,v) (get<(long long)a>(v))
#define mod 1000000007
#define mod1 998244353
#define N 1000003  //N idhar hai
#define inf 1e18
#define minf -1e18
#define min3(a,b,c) min(a,min(b,c))
#define max3(a,b,c) max(a,max(b,c))
#define ms(dp,a) memset(dp,(ll)a,sof(dp))
#define Foreach(i, c) for(__typeof((c).begin()) i = (c).begin(); i != (c).end(); ++i)
#define fr(i,b) for(int (i)=(0);(i) < (b); ++(i))
#define For(i,a,b) for(int (i)=(a);(i) < (b); ++(i))
#define rof(i,a,b) for(int (i)=(a);(i) >= (b); --(i))
#define rep(i, c) for(auto &(i) : (c))
#define FastIO ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL)
#define PRECISION(n) std::cout.unsetf ( std::ios::floatfield );std::cout.precision((ll)n)
#define getsm(v) accumulate(all(v),(ll)0)
#define getmx(v) max_element(all(v))
#define getmn(v) min_element(all(v))
#define ws1(a) cout<<(a)<<" "
#define wr1(a) cout<<(a)<<endl
#define wr2(a,b) cout<<(a)<<" "<<(b)<<endl
#define wr3(a,b,c) cout<<(a)<<" "<<(b)<<" "<<(c)<<endl
#define wr4(a,b,c,d) cout<<(a)<<" "<<(b)<<" "<<(c)<<" "<<(d)<<endl
#define ww1(a) cout<<(a)<<"\n"
#define ww2(a,b) cout<<(a)<<" "<<(b)<<"\n"
#define ww3(a,b,c) cout<<(a)<<" "<<(b)<<" "<<(c)<<"\n"
#define ww4(a,b,c,d) cout<<(a)<<" "<<(b)<<" "<<(c)<<" "<<(d)<<"\n"
#define FileIO freopen("input.txt","r",stdin);freopen("output.txt","w",stdout)
#define fill(dp,a,b) for(int i=0;i<a;i++)for(int j=0;j<b;j++)dp[i][j]=-1;
#define PI 3.14159265358979323846264338327950288419716939937510
#define fi first
#define se second
#define here cout<<"RSSB"<<endl
#define dbg cout<<"Krishna"<<endl
#define showzero cout<<std::showpoint
#define bitcount( x ) __builtin_popcountll( x )
#define ls(i) (1ll<<(i))
using namespace __gnu_pbds; //required
using namespace  std ;
//typedef double db;
typedef int ll ; //long long
typedef vector<int>vi ;
//typedef vector<l>vl ;
typedef vector<ll>vll ;
typedef vector<vector<ll> >vvl ;
typedef pair<int,int> pii ;
typedef pair<ll,ll> pll ;
typedef vector<pll>vpll;
typedef vector<string>vstr;
typedef vector<bool>vbool ;
template <typename T> using ordered_set =  tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
void READ(vll &v, ll n){ll a ;for(ll i=0 ; i<n ; i=i+1){cin>>a ;v.pb(a);}}
void PRINT(vll &v , ll a = 0){for(ll i=a ; i<v.size() ; i=i+1){/*v[i] = max((ll)0,v[i]);*/cout<<v[i]<<" " ;}cout<<"\n" ;}
//double logy(ll n , ll b){if(b==0){return(-1);}if(n==1){return(0);}return((db)log10(n)/log10(b));}
long long power(long long k , long long n , long long m=mod){long long res = 1;while(n){if(n%2!=0){res = (res*k)%m ;}k = (k*k)%m ;n = n/2 ;}return(res) ;}
double powerD(double k , long long n ){double res = 1;while(n){if(n%2!=0){res = (res*k) ;}k = (k*k) ;n = n/2 ;}return(res) ;}
ll gcdExtend(ll a , ll b , ll &x , ll &y){if(a==0){x = 0;y = 1;return(b);}ll x1,y1;ll g = gcdExtend(b%a,a,x1,y1);x = y1 - (b/a)*x1;y = x1;return(g);}
ll gcd(ll a, ll b) { return b ? gcd(b, a%b) : a; }
#define lcm(a,b) ((a/gcd(a,b))*b)
ll n,m,k,h,a1,a2,a3;
//db prob;
string str;
bool ok = true;
void go(ll a = 1)
{
    if(a)
    {
        ww1("Alice");
    }
    else
    {
        ww1("Bob");
    }
}
vvl v;
vll dis,pa;
ll da,db;
void dfs(ll i , ll x , ll par)
{
    pa[i] = par;
    dis[i] = x;
    for(auto j : v[i])
    {
        if(j!=par)
        {
            dfs(j,x+1,i);
        }
    }
}
void dfs1(ll i)
{
    ll y = i;
    ll d = dis[a2] - dis[y];
    ll c1 = dis[y];
    ll c2 = (d+db-1)/db;
    c1 = (dis[y]+da-1)/da;
    if(c2<c1-1)
    {
        d = dis[i]%da;
        if(d==0)
        {
            d = da;
        }
        ok|=(d<db-da);
    }
    for(auto j : v[i])
    {
        if(j!=pa[i])
        {
            dfs1(j);
        }
    }
}
void solveIt()
{
    ll a,b,c,d,i,j,x,y,z,t;
    ll p,q,w,r;
    string str1,str2;
    char ch;
    cin>>t;
    while(t--)
    {
        cin>>n>>a>>b>>da>>db;
        a1 = a;
        a2 = b;
        v.clear();
        v.resz(n+1);
        dis.clear();
        dis.resz(n+1);
        pa.clear();
        pa.resz(n+1);
        for(i=0 ; i<n-1 ; i++)
        {
            cin>>c>>d;
            v[c].pb(d);
            v[d].pb(c);
        }
        if(db<=da)
        {
            go();
            continue;
        }
        dfs(a,0,a);
        if(dis[b]<=da)
        {
            go();
            continue;
        }
        if(db>2*da)
        {
            go(0);
            continue;
        }
        ok = false;
        y = b;
        z = y;
        while(true)
        {
            d = dis[b] - dis[y];
            ll c1 = dis[y];
            ll c2 = (d+db-1)/db;
            c1 = (dis[y]+da-1)/da;
            if(c2<c1-1)
            {
                z = y;
                y = pa[y];
            }
            else
            {
                y = z;
                break;
            }
        }
        dfs1(y);
        go(!ok);
    }
}
int main()
{
#ifndef ONLINE_JUDGE
        freopen("Rinput.txt", "r", stdin);
        freopen("Routput.txt", "w", stdout);
#endif
    FastIO;
    PRECISION(12);
    //FileIO;
    //dr.pb(mkp(0,1));dr.pb(mkp(1,0));dr.pb(mkp(0,-1));dr.pb(mkp(-1,0));
    ll t = 1;
    //cin>>t;
    while(t--)
    {
        solveIt();
    }
    //WhateverItTakes
    //FOCUS
    //BeABelieverWarrior
    //DO IT UNTIL YOU RUN OUT OF IDEAS ~ YOU KNOW WHO
    //See The Editorial Almost Never ~ YOU KNOW WHO
}


/*In Case of TLE -> 1.Use Int instead of Long Long
                    2.Use FastIO
                    3.Use "\n" Instead of endl
                    4.Use Vector and Arrays instead of Sets,Maps(if possible)
*/
#include<bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp> //required
#include <ext/pb_ds/tree_policy.hpp> //required
#define pb push_back
#define pf push_front
#define all(x) (x).begin(),(x).end()
#define rall(x) (x).rbegin(),(x).rend()
#define distinct(x) sort(all(x)); x.resize(unique(all(x))-x.begin());
#define sz(x)  (long long)(x).size()
#define sqr(x) (x)*(x)
#define sof sizeof
#define resz resize
#define ins insert
#define lowerB lower_bound
#define upperB upper_bound
#define mkp make_pair
#define mkt make_tuple
#define act(a,v) (get<(long long)a>(v))
#define mod 1000000007
#define mod1 998244353
#define N 1000003  //N idhar hai
#define inf 1e18
#define minf -1e18
#define min3(a,b,c) min(a,min(b,c))
#define max3(a,b,c) max(a,max(b,c))
#define ms(dp,a) memset(dp,(ll)a,sof(dp))
#define Foreach(i, c) for(__typeof((c).begin()) i = (c).begin(); i != (c).end(); ++i)
#define fr(i,b) for(int (i)=(0);(i) < (b); ++(i))
#define For(i,a,b) for(int (i)=(a);(i) < (b); ++(i))
#define rof(i,a,b) for(int (i)=(a);(i) >= (b); --(i))
#define rep(i, c) for(auto &(i) : (c))
#define FastIO ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL)
#define PRECISION(n) std::cout.unsetf ( std::ios::floatfield );std::cout.precision((ll)n)
#define getsm(v) accumulate(all(v),(ll)0)
#define getmx(v) max_element(all(v))
#define getmn(v) min_element(all(v))
#define ws1(a) cout<<(a)<<" "
#define wr1(a) cout<<(a)<<endl
#define wr2(a,b) cout<<(a)<<" "<<(b)<<endl
#define wr3(a,b,c) cout<<(a)<<" "<<(b)<<" "<<(c)<<endl
#define wr4(a,b,c,d) cout<<(a)<<" "<<(b)<<" "<<(c)<<" "<<(d)<<endl
#define ww1(a) cout<<(a)<<"\n"
#define ww2(a,b) cout<<(a)<<" "<<(b)<<"\n"
#define ww3(a,b,c) cout<<(a)<<" "<<(b)<<" "<<(c)<<"\n"
#define ww4(a,b,c,d) cout<<(a)<<" "<<(b)<<" "<<(c)<<" "<<(d)<<"\n"
#define FileIO freopen("input.txt","r",stdin);freopen("output.txt","w",stdout)
#define fill(dp,a,b) for(int i=0;i<a;i++)for(int j=0;j<b;j++)dp[i][j]=-1;
#define PI 3.14159265358979323846264338327950288419716939937510
#define fi first
#define se second
#define here cout<<"RSSB"<<endl
#define dbg cout<<"Krishna"<<endl
#define showzero cout<<std::showpoint
#define bitcount( x ) __builtin_popcountll( x )
#define ls(i) (1ll<<(i))
using namespace __gnu_pbds; //required
using namespace  std ;
//typedef double db;
typedef int ll ; //long long
typedef vector<int>vi ;
//typedef vector<l>vl ;
typedef vector<ll>vll ;
typedef vector<vector<ll> >vvl ;
typedef pair<int,int> pii ;
typedef pair<ll,ll> pll ;
typedef vector<pll>vpll;
typedef vector<string>vstr;
typedef vector<bool>vbool ;
template <typename T> using ordered_set =  tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
void READ(vll &v, ll n){ll a ;for(ll i=0 ; i<n ; i=i+1){cin>>a ;v.pb(a);}}
void PRINT(vll &v , ll a = 0){for(ll i=a ; i<v.size() ; i=i+1){/*v[i] = max((ll)0,v[i]);*/cout<<v[i]<<" " ;}cout<<"\n" ;}
//double logy(ll n , ll b){if(b==0){return(-1);}if(n==1){return(0);}return((db)log10(n)/log10(b));}
long long power(long long k , long long n , long long m=mod){long long res = 1;while(n){if(n%2!=0){res = (res*k)%m ;}k = (k*k)%m ;n = n/2 ;}return(res) ;}
double powerD(double k , long long n ){double res = 1;while(n){if(n%2!=0){res = (res*k) ;}k = (k*k) ;n = n/2 ;}return(res) ;}
ll gcdExtend(ll a , ll b , ll &x , ll &y){if(a==0){x = 0;y = 1;return(b);}ll x1,y1;ll g = gcdExtend(b%a,a,x1,y1);x = y1 - (b/a)*x1;y = x1;return(g);}
ll gcd(ll a, ll b) { return b ? gcd(b, a%b) : a; }
#define lcm(a,b) ((a/gcd(a,b))*b)
ll n,m,k,h,a1,a2,a3;
//db prob;
string str;
bool ok = true;
void go(ll a = 1)
{
    if(a)
    {
        ww1("Alice");
    }
    else
    {
        ww1("Bob");
    }
}
vvl v;
vll dis,pa;
ll da,db;
void dfs(ll i , ll x , ll par)
{
    pa[i] = par;
    dis[i] = x;
    for(auto j : v[i])
    {
        if(j!=par)
        {
            dfs(j,x+1,i);
        }
    }
}
void dfs1(ll i)
{
    ll d = dis[i]%da;
    if(d==0)
    {
        d = da;
    }
    ok&=(d>=db-da);
    for(auto j : v[i])
    {
        if(j!=pa[i])
        {
            dfs1(j);
        }
    }
}
void solveIt()
{
    ll a,b,c,d,i,j,x,y,z,t;
    ll p,q,w,r;
    string str1,str2;
    char ch;
    cin>>t;
    while(t--)
    {
        cin>>n>>a>>b>>da>>db;
        if(db<=da)
        {
            go();
            continue;
        }
        if(db>2*da)
        {
            go(0);
            continue;
        }
        v.clear();
        v.resz(n+1);
        dis.clear();
        dis.resz(n+1);
        pa.clear();
        pa.resz(n+1);
        for(i=0 ; i<n-1 ; i++)
        {
            cin>>c>>d;
            v[c].pb(d);
            v[d].pb(c);
        }
        dfs(a,0,a);
        if(dis[b]<=da)
        {
            go();
            continue;
        }
        ok = true;
        y = b;
        z = y;
        while(true)
        {
            d = dis[b] - dis[y];
            ll c1 = dis[y];
            ll c2 = (d+db-1)/db;
            c1 = (dis[y]+da-1)/da;
            if(c2<c1-1)
            {
                z = y;
                y = pa[y];
            }
            else
            {
                y = z;
                break;
            }
        }
        dfs1(y);
        go(ok);
    }
}
int main()
{
#ifndef ONLINE_JUDGE
        freopen("Rinput.txt", "r", stdin);
        freopen("Routput.txt", "w", stdout);
#endif
    FastIO;
    PRECISION(12);
    //FileIO;
    //dr.pb(mkp(0,1));dr.pb(mkp(1,0));dr.pb(mkp(0,-1));dr.pb(mkp(-1,0));
    ll t = 1;
    //cin>>t;
    while(t--)
    {
        solveIt();
    }
    //WhateverItTakes
    //FOCUS
    //BeABelieverWarrior
    //DO IT UNTIL YOU RUN OUT OF IDEAS ~ YOU KNOW WHO
    //See The Editorial Almost Never ~ YOU KNOW WHO
}


/*In Case of TLE -> 1.Use Int instead of Long Long
                    2.Use FastIO
                    3.Use "\n" Instead of endl
                    4.Use Vector and Arrays instead of Sets,Maps(if possible)
*/
#include<bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp> //required
#include <ext/pb_ds/tree_policy.hpp> //required
#define pb push_back
#define pf push_front
#define all(x) (x).begin(),(x).end()
#define rall(x) (x).rbegin(),(x).rend()
#define distinct(x) sort(all(x)); x.resize(unique(all(x))-x.begin());
#define sz(x)  (long long)(x).size()
#define sqr(x) (x)*(x)
#define sof sizeof
#define resz resize
#define ins insert
#define lowerB lower_bound
#define upperB upper_bound
#define mkp make_pair
#define mkt make_tuple
#define act(a,v) (get<(long long)a>(v))
#define mod 1000000007
#define mod1 998244353
#define N 1000003  //N idhar hai
#define inf 1e18
#define minf -1e18
#define min3(a,b,c) min(a,min(b,c))
#define max3(a,b,c) max(a,max(b,c))
#define ms(dp,a) memset(dp,(ll)a,sof(dp))
#define Foreach(i, c) for(__typeof((c).begin()) i = (c).begin(); i != (c).end(); ++i)
#define fr(i,b) for(int (i)=(0);(i) < (b); ++(i))
#define For(i,a,b) for(int (i)=(a);(i) < (b); ++(i))
#define rof(i,a,b) for(int (i)=(a);(i) >= (b); --(i))
#define rep(i, c) for(auto &(i) : (c))
#define FastIO ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL)
#define PRECISION(n) std::cout.unsetf ( std::ios::floatfield );std::cout.precision((ll)n)
#define getsm(v) accumulate(all(v),(ll)0)
#define getmx(v) max_element(all(v))
#define getmn(v) min_element(all(v))
#define ws1(a) cout<<(a)<<" "
#define wr1(a) cout<<(a)<<endl
#define wr2(a,b) cout<<(a)<<" "<<(b)<<endl
#define wr3(a,b,c) cout<<(a)<<" "<<(b)<<" "<<(c)<<endl
#define wr4(a,b,c,d) cout<<(a)<<" "<<(b)<<" "<<(c)<<" "<<(d)<<endl
#define ww1(a) cout<<(a)<<"\n"
#define ww2(a,b) cout<<(a)<<" "<<(b)<<"\n"
#define ww3(a,b,c) cout<<(a)<<" "<<(b)<<" "<<(c)<<"\n"
#define ww4(a,b,c,d) cout<<(a)<<" "<<(b)<<" "<<(c)<<" "<<(d)<<"\n"
#define FileIO freopen("input.txt","r",stdin);freopen("output.txt","w",stdout)
#define fill(dp,a,b) for(int i=0;i<a;i++)for(int j=0;j<b;j++)dp[i][j]=-1;
#define PI 3.14159265358979323846264338327950288419716939937510
#define fi first
#define se second
#define here cout<<"RSSB"<<endl
#define dbg cout<<"Krishna"<<endl
#define showzero cout<<std::showpoint
#define bitcount( x ) __builtin_popcountll( x )
#define ls(i) (1ll<<(i))
using namespace __gnu_pbds; //required
using namespace  std ;
//typedef double db;
typedef int ll ; //long long
typedef vector<int>vi ;
//typedef vector<l>vl ;
typedef vector<ll>vll ;
typedef vector<vector<ll> >vvl ;
typedef pair<int,int> pii ;
typedef pair<ll,ll> pll ;
typedef vector<pll>vpll;
typedef vector<string>vstr;
typedef vector<bool>vbool ;
template <typename T> using ordered_set =  tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
void READ(vll &v, ll n){ll a ;for(ll i=0 ; i<n ; i=i+1){cin>>a ;v.pb(a);}}
void PRINT(vll &v , ll a = 0){for(ll i=a ; i<v.size() ; i=i+1){/*v[i] = max((ll)0,v[i]);*/cout<<v[i]<<" " ;}cout<<"\n" ;}
//double logy(ll n , ll b){if(b==0){return(-1);}if(n==1){return(0);}return((db)log10(n)/log10(b));}
long long power(long long k , long long n , long long m=mod){long long res = 1;while(n){if(n%2!=0){res = (res*k)%m ;}k = (k*k)%m ;n = n/2 ;}return(res) ;}
double powerD(double k , long long n ){double res = 1;while(n){if(n%2!=0){res = (res*k) ;}k = (k*k) ;n = n/2 ;}return(res) ;}
ll gcdExtend(ll a , ll b , ll &x , ll &y){if(a==0){x = 0;y = 1;return(b);}ll x1,y1;ll g = gcdExtend(b%a,a,x1,y1);x = y1 - (b/a)*x1;y = x1;return(g);}
ll gcd(ll a, ll b) { return b ? gcd(b, a%b) : a; }
#define lcm(a,b) ((a/gcd(a,b))*b)
ll n,m,k,h,a1,a2,a3;
//db prob;
string str;
bool ok = true;
void go(ll a = 1)
{
    if(a)
    {
        ww1("Alice");
    }
    else
    {
        ww1("Bob");
    }
}
vvl v;
vll dis,pa;
ll da,db;
void dfs(ll i , ll x , ll par)
{
    pa[i] = par;
    dis[i] = x;
    for(auto j : v[i])
    {
        if(j!=par)
        {
            dfs(j,x+1,i);
        }
    }
}
void dfs1(ll i)
{
    ll d = dis[i]%da;
    if(d==0)
    {
        d = da;
    }
    ok&=(d>=db-da);
    for(auto j : v[i])
    {
        if(j!=pa[i])
        {
            dfs1(j);
        }
    }
}
void solveIt()
{
    ll a,b,c,d,i,j,x,y,z,t;
    ll p,q,w,r;
    string str1,str2;
    char ch;
    cin>>t;
    while(t--)
    {
        cin>>n>>a>>b>>da>>db;
        v.clear();
        v.resz(n+1);
        dis.clear();
        dis.resz(n+1);
        pa.clear();
        pa.resz(n+1);
        for(i=0 ; i<n-1 ; i++)
        {
            cin>>c>>d;
            v[c].pb(d);
            v[d].pb(c);
        }
        if(db<=da)
        {
            go();
            continue;
        }
        if(db>2*da)
        {
            go(0);
            continue;
        }
        dfs(a,0,a);
        if(dis[b]<=da)
        {
            go();
            continue;
        }
        ok = true;
        y = b;
        z = y;
        while(true)
        {
            d = dis[b] - dis[y];
            ll c1 = dis[y];
            ll c2 = (d+db-1)/db;
            c1 = (dis[y]+da-1)/da;
            if(c2<c1-1)
            {
                z = y;
                y = pa[y];
            }
            else
            {
                y = z;
                break;
            }
        }
        dfs1(y);
        go(ok);
    }
}
int main()
{
#ifndef ONLINE_JUDGE
        freopen("Rinput.txt", "r", stdin);
        freopen("Routput.txt", "w", stdout);
#endif
    FastIO;
    PRECISION(12);
    //FileIO;
    //dr.pb(mkp(0,1));dr.pb(mkp(1,0));dr.pb(mkp(0,-1));dr.pb(mkp(-1,0));
    ll t = 1;
    //cin>>t;
    while(t--)
    {
        solveIt();
    }
    //WhateverItTakes
    //FOCUS
    //BeABelieverWarrior
    //DO IT UNTIL YOU RUN OUT OF IDEAS ~ YOU KNOW WHO
    //See The Editorial Almost Never ~ YOU KNOW WHO
}


/*In Case of TLE -> 1.Use Int instead of Long Long
                    2.Use FastIO
                    3.Use "\n" Instead of endl
                    4.Use Vector and Arrays instead of Sets,Maps(if possible)
*/
#include<bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp> //required
#include <ext/pb_ds/tree_policy.hpp> //required
#define pb push_back
#define pf push_front
#define all(x) (x).begin(),(x).end()
#define rall(x) (x).rbegin(),(x).rend()
#define distinct(x) sort(all(x)); x.resize(unique(all(x))-x.begin());
#define sz(x)  (long long)(x).size()
#define sqr(x) (x)*(x)
#define sof sizeof
#define resz resize
#define ins insert
#define lowerB lower_bound
#define upperB upper_bound
#define mkp make_pair
#define mkt make_tuple
#define act(a,v) (get<(long long)a>(v))
#define mod 1000000007
#define mod1 998244353
#define N 1000003  //N idhar hai
#define inf 1e18
#define minf -1e18
#define min3(a,b,c) min(a,min(b,c))
#define max3(a,b,c) max(a,max(b,c))
#define ms(dp,a) memset(dp,(ll)a,sof(dp))
#define Foreach(i, c) for(__typeof((c).begin()) i = (c).begin(); i != (c).end(); ++i)
#define fr(i,b) for(int (i)=(0);(i) < (b); ++(i))
#define For(i,a,b) for(int (i)=(a);(i) < (b); ++(i))
#define rof(i,a,b) for(int (i)=(a);(i) >= (b); --(i))
#define rep(i, c) for(auto &(i) : (c))
#define FastIO ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL)
#define PRECISION(n) std::cout.unsetf ( std::ios::floatfield );std::cout.precision((ll)n)
#define getsm(v) accumulate(all(v),(ll)0)
#define getmx(v) max_element(all(v))
#define getmn(v) min_element(all(v))
#define ws1(a) cout<<(a)<<" "
#define wr1(a) cout<<(a)<<endl
#define wr2(a,b) cout<<(a)<<" "<<(b)<<endl
#define wr3(a,b,c) cout<<(a)<<" "<<(b)<<" "<<(c)<<endl
#define wr4(a,b,c,d) cout<<(a)<<" "<<(b)<<" "<<(c)<<" "<<(d)<<endl
#define ww1(a) cout<<(a)<<"\n"
#define ww2(a,b) cout<<(a)<<" "<<(b)<<"\n"
#define ww3(a,b,c) cout<<(a)<<" "<<(b)<<" "<<(c)<<"\n"
#define ww4(a,b,c,d) cout<<(a)<<" "<<(b)<<" "<<(c)<<" "<<(d)<<"\n"
#define FileIO freopen("input.txt","r",stdin);freopen("output.txt","w",stdout)
#define fill(dp,a,b) for(int i=0;i<a;i++)for(int j=0;j<b;j++)dp[i][j]=-1;
#define PI 3.14159265358979323846264338327950288419716939937510
#define fi first
#define se second
#define here cout<<"RSSB"<<endl
#define dbg cout<<"Krishna"<<endl
#define showzero cout<<std::showpoint
#define bitcount( x ) __builtin_popcountll( x )
#define ls(i) (1ll<<(i))
using namespace __gnu_pbds; //required
using namespace  std ;
//typedef double db;
typedef int ll ; //long long
typedef vector<int>vi ;
//typedef vector<l>vl ;
typedef vector<ll>vll ;
typedef vector<vector<ll> >vvl ;
typedef pair<int,int> pii ;
typedef pair<ll,ll> pll ;
typedef vector<pll>vpll;
typedef vector<string>vstr;
typedef vector<bool>vbool ;
template <typename T> using ordered_set =  tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
void READ(vll &v, ll n){ll a ;for(ll i=0 ; i<n ; i=i+1){cin>>a ;v.pb(a);}}
void PRINT(vll &v , ll a = 0){for(ll i=a ; i<v.size() ; i=i+1){/*v[i] = max((ll)0,v[i]);*/cout<<v[i]<<" " ;}cout<<"\n" ;}
//double logy(ll n , ll b){if(b==0){return(-1);}if(n==1){return(0);}return((db)log10(n)/log10(b));}
long long power(long long k , long long n , long long m=mod){long long res = 1;while(n){if(n%2!=0){res = (res*k)%m ;}k = (k*k)%m ;n = n/2 ;}return(res) ;}
double powerD(double k , long long n ){double res = 1;while(n){if(n%2!=0){res = (res*k) ;}k = (k*k) ;n = n/2 ;}return(res) ;}
ll gcdExtend(ll a , ll b , ll &x , ll &y){if(a==0){x = 0;y = 1;return(b);}ll x1,y1;ll g = gcdExtend(b%a,a,x1,y1);x = y1 - (b/a)*x1;y = x1;return(g);}
ll gcd(ll a, ll b) { return b ? gcd(b, a%b) : a; }
#define lcm(a,b) ((a/gcd(a,b))*b)
ll n,m,k,h,a1,a2,a3;
//db prob;
string str;
bool ok = true;
void go(ll a = 1)
{
    if(a)
    {
        ww1("Alice");
    }
    else
    {
        ww1("Bob");
    }
}
vvl v;
vll dis,pa;
ll da,db;
void dfs(ll i , ll x , ll par)
{
    pa[i] = par;
    dis[i] = x;
    for(auto j : v[i])
    {
        if(j!=par)
        {
            dfs(j,x+1,i);
        }
    }
}
void dfs1(ll i)
{
    ll d = dis[i]%da;
    if(d==0)
    {
        d = da;
    }
    ok&=(d>=db-da);
    for(auto j : v[i])
    {
        if(j!=pa[i])
        {
            dfs1(j);
        }
    }
}
void solveIt()
{
    ll a,b,c,d,i,j,x,y,z,t;
    ll p,q,w,r;
    string str1,str2;
    char ch;
    cin>>t;
    while(t--)
    {
        cin>>n>>a>>b>>da>>db;
        v.clear();
        v.resz(n+1);
        dis.clear();
        dis.resz(n+1);
        pa.clear();
        pa.resz(n+1);
        for(i=0 ; i<n-1 ; i++)
        {
            cin>>c>>d;
            v[c].pb(d);
            v[d].pb(c);
        }
        if(db<=da)
        {
            go();
            continue;
        }
        dfs(a,0,a);
        if(dis[b]<=da)
        {
            go();
            continue;
        }
        if(db>2*da)
        {
            go(0);
            continue;
        }
        ok = true;
        y = b;
        z = y;
        while(true)
        {
            d = dis[b] - dis[y];
            ll c1 = dis[y];
            ll c2 = (d+db-1)/db;
            c1 = (dis[y]+da-1)/da;
            if(c2<c1)
            {
                z = y;
                y = pa[y];
            }
            else
            {
                y = z;
                break;
            }
        }
        dfs1(y);
        go(ok);
    }
}
int main()
{
#ifndef ONLINE_JUDGE
        freopen("Rinput.txt", "r", stdin);
        freopen("Routput.txt", "w", stdout);
#endif
    FastIO;
    PRECISION(12);
    //FileIO;
    //dr.pb(mkp(0,1));dr.pb(mkp(1,0));dr.pb(mkp(0,-1));dr.pb(mkp(-1,0));
    ll t = 1;
    //cin>>t;
    while(t--)
    {
        solveIt();
    }
    //WhateverItTakes
    //FOCUS
    //BeABelieverWarrior
    //DO IT UNTIL YOU RUN OUT OF IDEAS ~ YOU KNOW WHO
    //See The Editorial Almost Never ~ YOU KNOW WHO
}


/*In Case of TLE -> 1.Use Int instead of Long Long
                    2.Use FastIO
                    3.Use "\n" Instead of endl
                    4.Use Vector and Arrays instead of Sets,Maps(if possible)
*/
#include<bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp> //required
#include <ext/pb_ds/tree_policy.hpp> //required
#define pb push_back
#define pf push_front
#define all(x) (x).begin(),(x).end()
#define rall(x) (x).rbegin(),(x).rend()
#define distinct(x) sort(all(x)); x.resize(unique(all(x))-x.begin());
#define sz(x)  (long long)(x).size()
#define sqr(x) (x)*(x)
#define sof sizeof
#define resz resize
#define ins insert
#define lowerB lower_bound
#define upperB upper_bound
#define mkp make_pair
#define mkt make_tuple
#define act(a,v) (get<(long long)a>(v))
#define mod 1000000007
#define mod1 998244353
#define N 1000003  //N idhar hai
#define inf 1e18
#define minf -1e18
#define min3(a,b,c) min(a,min(b,c))
#define max3(a,b,c) max(a,max(b,c))
#define ms(dp,a) memset(dp,(ll)a,sof(dp))
#define Foreach(i, c) for(__typeof((c).begin()) i = (c).begin(); i != (c).end(); ++i)
#define fr(i,b) for(int (i)=(0);(i) < (b); ++(i))
#define For(i,a,b) for(int (i)=(a);(i) < (b); ++(i))
#define rof(i,a,b) for(int (i)=(a);(i) >= (b); --(i))
#define rep(i, c) for(auto &(i) : (c))
#define FastIO ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL)
#define PRECISION(n) std::cout.unsetf ( std::ios::floatfield );std::cout.precision((ll)n)
#define getsm(v) accumulate(all(v),(ll)0)
#define getmx(v) max_element(all(v))
#define getmn(v) min_element(all(v))
#define ws1(a) cout<<(a)<<" "
#define wr1(a) cout<<(a)<<endl
#define wr2(a,b) cout<<(a)<<" "<<(b)<<endl
#define wr3(a,b,c) cout<<(a)<<" "<<(b)<<" "<<(c)<<endl
#define wr4(a,b,c,d) cout<<(a)<<" "<<(b)<<" "<<(c)<<" "<<(d)<<endl
#define ww1(a) cout<<(a)<<"\n"
#define ww2(a,b) cout<<(a)<<" "<<(b)<<"\n"
#define ww3(a,b,c) cout<<(a)<<" "<<(b)<<" "<<(c)<<"\n"
#define ww4(a,b,c,d) cout<<(a)<<" "<<(b)<<" "<<(c)<<" "<<(d)<<"\n"
#define FileIO freopen("input.txt","r",stdin);freopen("output.txt","w",stdout)
#define fill(dp,a,b) for(int i=0;i<a;i++)for(int j=0;j<b;j++)dp[i][j]=-1;
#define PI 3.14159265358979323846264338327950288419716939937510
#define fi first
#define se second
#define here cout<<"RSSB"<<endl
#define dbg cout<<"Krishna"<<endl
#define showzero cout<<std::showpoint
#define bitcount( x ) __builtin_popcountll( x )
#define ls(i) (1ll<<(i))
using namespace __gnu_pbds; //required
using namespace  std ;
typedef double db;
typedef long long ll ; //long long
typedef vector<int>vi ;
//typedef vector<l>vl ;
typedef vector<ll>vll ;
typedef vector<vector<ll> >vvl ;
typedef pair<int,int> pii ;
typedef pair<ll,ll> pll ;
typedef vector<pll>vpll;
typedef vector<string>vstr;
typedef vector<bool>vbool ;
template <typename T> using ordered_set =  tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
void READ(vll &v, ll n){ll a ;for(ll i=0 ; i<n ; i=i+1){cin>>a ;v.pb(a);}}
void PRINT(vll &v , ll a = 0){for(ll i=a ; i<v.size() ; i=i+1){/*v[i] = max((ll)0,v[i]);*/cout<<v[i]<<" " ;}cout<<"\n" ;}
double logy(ll n , ll b){if(b==0){return(-1);}if(n==1){return(0);}return((db)log10(n)/log10(b));}
long long power(long long k , long long n , long long m=mod){long long res = 1;while(n){if(n%2!=0){res = (res*k)%m ;}k = (k*k)%m ;n = n/2 ;}return(res) ;}
double powerD(double k , long long n ){double res = 1;while(n){if(n%2!=0){res = (res*k) ;}k = (k*k) ;n = n/2 ;}return(res) ;}
ll gcdExtend(ll a , ll b , ll &x , ll &y){if(a==0){x = 0;y = 1;return(b);}ll x1,y1;ll g = gcdExtend(b%a,a,x1,y1);x = y1 - (b/a)*x1;y = x1;return(g);}
ll gcd(ll a, ll b) { return b ? gcd(b, a%b) : a; }
#define lcm(a,b) ((a/gcd(a,b))*b)
ll n,m,k,h,a1,a2,a3;
db prob;
string str;
bool ok = true;
void go(ll a = 1)
{
    if(a)
    {
        ww1("Alice");
    }
    else
    {
        ww1("Bob");
    }
}
void solveIt()
{
    ll a,b,c,d,i,j,x,y,z,t,s;
    ll p,q,w,r;
    string str1,str2;
    char ch;
    cin>>t;
    while(t--)
    {
        ll da,db;
        cin>>n>>a>>b>>da>>db;
        vvl v(n+1);
        if(db<da)
        {
            go();
            continue;
        }
        for(i=0 ; i<n-1 ; i++)
        {
            cin>>c>>d;
            v[c].pb(d);
            v[d].pb(c);
        }
        vll dis(n+1,inf);
        set<pll>s;
        s.ins(mkp(0,a));
        dis[a] = 0;
        while(sz(s))
        {
            auto p1 = *s.begin();
            s.erase(p1);
            x = p1.fi;
            y = p1.se;
            for(auto j : v[y])
            {
                if(dis[j]>x+1)
                {
                    if(dis[j]!=inf)
                    {
                        s.erase(mkp(dis[j],j));
                    }
                    dis[j] = x + 1;
                    s.ins(mkp(x+1,j));
                }
            }
        }
        if(dis[b]<=da)
        {
            go();
            continue;
        }
        x = dis[b] - (dis[b]/da)*da;
        if(x==0)
        {
            x = da;
        }
        go((x>=db-da));
    }
}
int main()
{
#ifndef ONLINE_JUDGE
        freopen("Rinput.txt", "r", stdin);
        freopen("Routput.txt", "w", stdout);
#endif
    FastIO;
    PRECISION(12);
    //FileIO;
    //dr.pb(mkp(0,1));dr.pb(mkp(1,0));dr.pb(mkp(0,-1));dr.pb(mkp(-1,0));
    ll t = 1;
    //cin>>t;
    while(t--)
    {
        solveIt();
    }
    //WhateverItTakes
    //FOCUS
    //BeABelieverWarrior
    //DO IT UNTIL YOU RUN OUT OF IDEAS ~ YOU KNOW WHO
    //See The Editorial Almost Never ~ YOU KNOW WHO
}


/*In Case of TLE -> 1.Use Int instead of Long Long
                    2.Use FastIO
                    3.Use "\n" Instead of endl
                    4.Use Vector and Arrays instead of Sets,Maps(if possible)
*/
#include<bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp> //required
#include <ext/pb_ds/tree_policy.hpp> //required
#define pb push_back
#define pf push_front
#define all(x) (x).begin(),(x).end()
#define rall(x) (x).rbegin(),(x).rend()
#define distinct(x) sort(all(x)); x.resize(unique(all(x))-x.begin());
#define sz(x)  (long long)(x).size()
#define sqr(x) (x)*(x)
#define sof sizeof
#define resz resize
#define ins insert
#define lowerB lower_bound
#define upperB upper_bound
#define mkp make_pair
#define mkt make_tuple
#define act(a,v) (get<(long long)a>(v))
#define mod 1000000007
#define mod1 998244353
#define N 1000003  //N idhar hai
#define inf 1e18
#define minf -1e18
#define min3(a,b,c) min(a,min(b,c))
#define max3(a,b,c) max(a,max(b,c))
#define ms(dp,a) memset(dp,(ll)a,sof(dp))
#define Foreach(i, c) for(__typeof((c).begin()) i = (c).begin(); i != (c).end(); ++i)
#define fr(i,b) for(int (i)=(0);(i) < (b); ++(i))
#define For(i,a,b) for(int (i)=(a);(i) < (b); ++(i))
#define rof(i,a,b) for(int (i)=(a);(i) >= (b); --(i))
#define rep(i, c) for(auto &(i) : (c))
#define FastIO ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL)
#define PRECISION(n) std::cout.unsetf ( std::ios::floatfield );std::cout.precision((ll)n)
#define getsm(v) accumulate(all(v),(ll)0)
#define getmx(v) max_element(all(v))
#define getmn(v) min_element(all(v))
#define ws1(a) cout<<(a)<<" "
#define wr1(a) cout<<(a)<<endl
#define wr2(a,b) cout<<(a)<<" "<<(b)<<endl
#define wr3(a,b,c) cout<<(a)<<" "<<(b)<<" "<<(c)<<endl
#define wr4(a,b,c,d) cout<<(a)<<" "<<(b)<<" "<<(c)<<" "<<(d)<<endl
#define ww1(a) cout<<(a)<<"\n"
#define ww2(a,b) cout<<(a)<<" "<<(b)<<"\n"
#define ww3(a,b,c) cout<<(a)<<" "<<(b)<<" "<<(c)<<"\n"
#define ww4(a,b,c,d) cout<<(a)<<" "<<(b)<<" "<<(c)<<" "<<(d)<<"\n"
#define FileIO freopen("input.txt","r",stdin);freopen("output.txt","w",stdout)
#define fill(dp,a,b) for(int i=0;i<a;i++)for(int j=0;j<b;j++)dp[i][j]=-1;
#define PI 3.14159265358979323846264338327950288419716939937510
#define fi first
#define se second
#define here cout<<"RSSB"<<endl
#define dbg cout<<"Krishna"<<endl
#define showzero cout<<std::showpoint
#define bitcount( x ) __builtin_popcountll( x )
#define ls(i) (1ll<<(i))
using namespace __gnu_pbds; //required
using namespace  std ;
typedef double db;
typedef long long ll ; //long long
typedef vector<int>vi ;
//typedef vector<l>vl ;
typedef vector<ll>vll ;
typedef vector<vector<ll> >vvl ;
typedef pair<int,int> pii ;
typedef pair<ll,ll> pll ;
typedef vector<pll>vpll;
typedef vector<string>vstr;
typedef vector<bool>vbool ;
template <typename T> using ordered_set =  tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
void READ(vll &v, ll n){ll a ;for(ll i=0 ; i<n ; i=i+1){cin>>a ;v.pb(a);}}
void PRINT(vll &v , ll a = 0){for(ll i=a ; i<v.size() ; i=i+1){/*v[i] = max((ll)0,v[i]);*/cout<<v[i]<<" " ;}cout<<"\n" ;}
double logy(ll n , ll b){if(b==0){return(-1);}if(n==1){return(0);}return((db)log10(n)/log10(b));}
long long power(long long k , long long n , long long m=mod){long long res = 1;while(n){if(n%2!=0){res = (res*k)%m ;}k = (k*k)%m ;n = n/2 ;}return(res) ;}
double powerD(double k , long long n ){double res = 1;while(n){if(n%2!=0){res = (res*k) ;}k = (k*k) ;n = n/2 ;}return(res) ;}
ll gcdExtend(ll a , ll b , ll &x , ll &y){if(a==0){x = 0;y = 1;return(b);}ll x1,y1;ll g = gcdExtend(b%a,a,x1,y1);x = y1 - (b/a)*x1;y = x1;return(g);}
ll gcd(ll a, ll b) { return b ? gcd(b, a%b) : a; }
#define lcm(a,b) ((a/gcd(a,b))*b)
ll n,m,k,h,a1,a2,a3;
db prob;
string str;
bool ok = true;
void go(ll a = 1)
{
    if(a)
    {
        ww1("Alice");
    }
    else
    {
        ww1("Bob");
    }
}
vvl v;
vll dis,tmp;
ll dfs(ll i , ll x , ll par)
{
    dis[i] = x;
    tmp[i] = x;
    ll y = x;
    for(auto j : v[i])
    {
        if(j!=par)
        {
            y = max(y,dfs(j,x+1,i));
        }
    }
    tmp[i] = y;
    return(y);
}
void solveIt()
{
    ll a,b,c,d,i,j,x,y,z,t;
    ll p,q,w,r;
    string str1,str2;
    char ch;
    cin>>t;
    while(t--)
    {
        ll da,db;
        cin>>n>>a>>b>>da>>db;
        v.clear();
        v.resz(n+1);
        dis.clear();
        tmp.clear();
        dis.resz(n+1);
        tmp.resz(n+1);
        if(db<=da)
        {
            go();
            continue;
        }
        for(i=0 ; i<n-1 ; i++)
        {
            cin>>c>>d;
            v[c].pb(d);
            v[d].pb(c);
        }
        dfs(a,0,-1);
        if(dis[b]<=da)
        {
            go();
            continue;
        }
        ok = true;
        for(i=dis[b] ; i<=tmp[b] ; i++)
        {
            x = i%da;
            if(x==0)
            {
                x = da;
            }
            ok&=(x>=db-da);
        }
        go(ok);
    }
}
int main()
{
#ifndef ONLINE_JUDGE
        freopen("Rinput.txt", "r", stdin);
        freopen("Routput.txt", "w", stdout);
#endif
    FastIO;
    PRECISION(12);
    //FileIO;
    //dr.pb(mkp(0,1));dr.pb(mkp(1,0));dr.pb(mkp(0,-1));dr.pb(mkp(-1,0));
    ll t = 1;
    //cin>>t;
    while(t--)
    {
        solveIt();
    }
    //WhateverItTakes
    //FOCUS
    //BeABelieverWarrior
    //DO IT UNTIL YOU RUN OUT OF IDEAS ~ YOU KNOW WHO
    //See The Editorial Almost Never ~ YOU KNOW WHO
}


#include <iostream>
#include <bits/stdc++.h>
using namespace std;
#define debug(x) cout<<#x<<" :: "<<x<<"\n";
#define debug2(x,y) cout<<#x<<" :: "<<x<<"\t"<<#y<<" :: "<<y<<"\n";
#define debug3(x,y,z) cout<<#x<<" :: "<<x<<"\t"<<#y<<" :: "<<y<<"\t"<<#z<<" :: "<<z<<"\n";

int ne, gg;
vector<int> v[100005];
int depth[100005];
int n, a, b, da, db, diam;

int dfs (int node, int par) {

	ne = node;

	int tt = 0;
	for (int i = 0; i < v[node].size(); i++) {
		int next = v[node][i];

		if (next != par) {
			tt = max (tt, dfs (next, node));
		}
	}

	tt++;
	return tt;

}

void dis (int node, int par, int dep) {

	depth[node] = dep;

	for (int i = 0; i < v[node].size(); i++) {
		int next = v[node][i];

		if (next != par) {
			dis(next, node, dep + 1);
		}
	}
}

int dfs2(int x, int p) {
	int len = 0;
	for (int y : v[x]) {
		if (y != p) {
			depth[y] = depth[x] + 1;
			int cur = 1 + dfs(y, x);
			diam = max(diam, cur + len);
			len = max(len, cur);
		}
	}
	return len;
}

int main() {

	int t;
	cin >> t;
	while (t--) {

		cin >> n >> a >> b >> da >> db;
		gg = 1, ne = 1, diam = 0 ;

		for (int i = 0; i < n - 1; i++) {
			int x, y;
			cin >> x >> y;
			v[x].push_back(y);
			v[y].push_back(x);
		}

		// dis(a, 0, 0);

		dfs2(a, 0);

		int ab_dis = abs(depth[b]);

		// dfs(ne, 0);

		// int diam = dfs(ne, 0) - 1;

		// debug(diam);

		string ans;

		// for (int i = 1; i <= n; i++) {
		// 	debug2(i, depth[i]);
		// }

		if (ab_dis <= da)
			ans = "Alice";
		else if (diam <= 2 * da)
			ans = "Alice";
		else if (db <= 2 * da)
			ans = "Alice";
		else
			ans = "Bob";

		for (int i = 0; i <= n; i++) {
			v[i].clear();
			depth[i] = 0;
		}
		cout << ans << endl ;
	}
}


#include <iostream>
#include <bits/stdc++.h>
using namespace std;
#define debug(x) cout<<#x<<" :: "<<x<<"\n";
#define debug2(x,y) cout<<#x<<" :: "<<x<<"\t"<<#y<<" :: "<<y<<"\n";
#define debug3(x,y,z) cout<<#x<<" :: "<<x<<"\t"<<#y<<" :: "<<y<<"\t"<<#z<<" :: "<<z<<"\n";

int ne, gg;
vector<int> v[100005];
int depth[100005];
int n, a, b, da, db, diam, large = -1;

int dfs (int node, int par) {

	ne = node;

	int tt = 0;
	for (int i = 0; i < v[node].size(); i++) {
		int next = v[node][i];

		if (next != par) {
			tt = max (tt, dfs (next, node));
		}
	}

	tt++;
	return tt;

}

void dis (int node, int par, int dep) {

	depth[node] = dep;

	if (dep > large) {
		ne = node;
		large = dep;
	}

	for (int i = 0; i < v[node].size(); i++) {
		int next = v[node][i];

		if (next != par) {
			dis(next, node, dep + 1);
		}
	}
}

// int dfs2(int x, int p) {
// 	int len = 0;
// 	for (int y : v[x]) {
// 		if (y != p) {
// 			depth[y] = depth[x] + 1;
// 			int cur = 1 + dfs2(y, x);
// 			diam = max(diam, cur + len);
// 			len = max(len, cur);
// 		}
// 	}
// 	return len;
// }

int main() {

	int t;
	cin >> t;
	while (t--) {

		large = 0;
		cin >> n >> a >> b >> da >> db;
		gg = 1, ne = 1, diam = 0 ;

		for (int i = 0; i < n - 1; i++) {
			int x, y;
			cin >> x >> y;
			v[x].push_back(y);
			v[y].push_back(x);
		}

		dis(a, 0, 0);
		int ab_dis = abs(depth[b]);

		// dfs2(a, 0);

		dfs(ne, 0);
		diam = dfs(ne, 0) - 1;

		// debug(diam);

		string ans;

		if (ab_dis <= da)
			ans = "Alice";
		else if (diam <= 2 * da)
			ans = "Alice";
		else if (db <= 2 * da)
			ans = "Alice";
		else
			ans = "Bob";

		for (int i = 0; i <= n; i++) {
			v[i].clear();
			depth[i] = 0;
		}
		cout << ans << endl ;
	}
}


#include <iostream>
#include <bits/stdc++.h>
using namespace std;
#define debug(x) cout<<#x<<" :: "<<x<<"\n";
#define debug2(x,y) cout<<#x<<" :: "<<x<<"\t"<<#y<<" :: "<<y<<"\n";
#define debug3(x,y,z) cout<<#x<<" :: "<<x<<"\t"<<#y<<" :: "<<y<<"\t"<<#z<<" :: "<<z<<"\n";

int ne, gg;
vector<int> v[100005];
int depth[100005];
int n, a, b, da, db, diam, large = -1;

int dfs (int node, int par) {

	int tt = 0;
	for (int i = 0; i < v[node].size(); i++) {
		int next = v[node][i];

		if (next != par) {
			tt = max (tt, dfs (next, node));
		}
	}

	tt++;
	return tt;

}

void dis (int node, int par, int dep) {

	depth[node] = dep;

	if (dep > large) {
		ne = node;
		large = dep;
	}

	for (int i = 0; i < v[node].size(); i++) {
		int next = v[node][i];

		if (next != par) {
			dis(next, node, dep + 1);
		}
	}
}

// int dfs2(int x, int p) {
// 	int len = 0;
// 	for (int y : v[x]) {
// 		if (y != p) {
// 			depth[y] = depth[x] + 1;
// 			int cur = 1 + dfs2(y, x);
// 			diam = max(diam, cur + len);
// 			len = max(len, cur);
// 		}
// 	}
// 	return len;
// }

int main() {

	int t;
	cin >> t;
	while (t--) {

		large = 0;
		cin >> n >> a >> b >> da >> db;
		gg = 1, ne = 1, diam = 0 ;

		for (int i = 0; i < n - 1; i++) {
			int x, y;
			cin >> x >> y;
			v[x].push_back(y);
			v[y].push_back(x);
		}

		dis(a, 0, 0);
		int ab_dis = abs(depth[b]);

		// dfs2(a, 0);
		diam = dfs(ne, 0) - 1;

		// debug(diam);

		string ans;

		if (ab_dis <= da)
			ans = "Alice";
		else if (diam <= 2 * da)
			ans = "Alice";
		else if (db <= 2 * da)
			ans = "Alice";
		else
			ans = "Bob";

		for (int i = 0; i <= n; i++) {
			v[i].clear();
			depth[i] = 0;
		}
		cout << ans << endl ;
	}
}


#include <iostream>
#include <bits/stdc++.h>
using namespace std;
#define debug(x) cout<<#x<<" :: "<<x<<"\n";
#define debug2(x,y) cout<<#x<<" :: "<<x<<"\t"<<#y<<" :: "<<y<<"\n";
#define debug3(x,y,z) cout<<#x<<" :: "<<x<<"\t"<<#y<<" :: "<<y<<"\t"<<#z<<" :: "<<z<<"\n";

int ne, gg;
vector<int> v[100005];
int depth[100005];
int n, a, b, da, db, diam;

// int dfs (int node, int par) {

// 	ne = node;

// 	int tt = 0;
// 	for (int i = 0; i < v[node].size(); i++) {
// 		int next = v[node][i];

// 		if (next != par) {
// 			tt = max (tt, dfs (next, node));
// 		}
// 	}

// 	tt++;
// 	return tt;

// }

// void dis (int node, int par, int dep) {

// 	depth[node] = dep;

// 	for (int i = 0; i < v[node].size(); i++) {
// 		int next = v[node][i];

// 		if (next != par) {
// 			dis(next, node, dep + 1);
// 		}
// 	}
// }

int dfs2(int x, int p) {
	int len = 0;
	for (int y : v[x]) {
		if (y != p) {
			depth[y] = depth[x] + 1;
			int cur = 1 + dfs2(y, x);
			diam = max(diam, cur + len);
			len = max(len, cur);
		}
	}
	return len;
}

int main() {

	int t;
	cin >> t;
	while (t--) {

		cin >> n >> a >> b >> da >> db;
		gg = 1, ne = 1, diam = 0 ;

		for (int i = 0; i < n - 1; i++) {
			int x, y;
			cin >> x >> y;
			v[x].push_back(y);
			v[y].push_back(x);
		}

		// dis(a, 0, 0);

		dfs2(a, 0);

		int ab_dis = abs(depth[b]);

		// dfs(ne, 0);

		// int diam = dfs(ne, 0) - 1;

		// debug(diam);

		string ans;

		// for (int i = 1; i <= n; i++) {
		// 	debug2(i, depth[i]);
		// }

		if (ab_dis <= da)
			ans = "Alice";
		else if (diam <= 2 * da)
			ans = "Alice";
		else if (db <= 2 * da)
			ans = "Alice";
		else
			ans = "Bob";

		for (int i = 0; i <= n; i++) {
			v[i].clear();
			depth[i] = 0;
		}
		cout << ans << endl ;
	}
}


#include <iostream>
#include <bits/stdc++.h>
using namespace std;
#define debug(x) cout<<#x<<" :: "<<x<<"\n";
#define debug2(x,y) cout<<#x<<" :: "<<x<<"\t"<<#y<<" :: "<<y<<"\n";
#define debug3(x,y,z) cout<<#x<<" :: "<<x<<"\t"<<#y<<" :: "<<y<<"\t"<<#z<<" :: "<<z<<"\n";

int ne, gg;
vector<int> v[100005];
int depth[100005];
int n, a, b, da, db, diam;

int dfs (int node, int par) {

	ne = node;

	int tt = 0;
	for (int i = 0; i < v[node].size(); i++) {
		int next = v[node][i];

		if (next != par) {
			tt = max (tt, dfs (next, node));
		}
	}

	tt++;
	return tt;

}

// void dis (int node, int par, int dep) {

// 	depth[node] = dep;

// 	for (int i = 0; i < v[node].size(); i++) {
// 		int next = v[node][i];

// 		if (next != par) {
// 			dis(next, node, dep + 1);
// 		}
// 	}
// }

int dfs2(int x, int p) {
	int len = 0;
	for (int y : v[x]) {
		if (y != p) {
			depth[y] = depth[x] + 1;
			int cur = 1 + dfs2(y, x);
			diam = max(diam, cur + len);
			len = max(len, cur);
		}
	}
	return len;
}

int main() {

	int t;
	cin >> t;
	while (t--) {

		cin >> n >> a >> b >> da >> db;
		gg = 1, ne = 1, diam = 0 ;

		for (int i = 0; i < n - 1; i++) {
			int x, y;
			cin >> x >> y;
			v[x].push_back(y);
			v[y].push_back(x);
		}

		// dis(a, 0, 0);

		dfs2(a, 0);

		int ab_dis = abs(depth[b]);

		dfs(ne, 0);

		diam = dfs(ne, 0) - 1;

		// debug(diam);

		string ans;

		// for (int i = 1; i <= n; i++) {
		// 	debug2(i, depth[i]);
		// }

		if (ab_dis <= da)
			ans = "Alice";
		else if (diam <= 2 * da)
			ans = "Alice";
		else if (db <= 2 * da)
			ans = "Alice";
		else
			ans = "Bob";

		for (int i = 0; i <= n; i++) {
			v[i].clear();
			depth[i] = 0;
		}
		cout << ans << endl ;
	}
}


#include <iostream>
#include <bits/stdc++.h>
using namespace std;
#define debug(x) cout<<#x<<" :: "<<x<<"\n";
#define debug2(x,y) cout<<#x<<" :: "<<x<<"\t"<<#y<<" :: "<<y<<"\n";
#define debug3(x,y,z) cout<<#x<<" :: "<<x<<"\t"<<#y<<" :: "<<y<<"\t"<<#z<<" :: "<<z<<"\n";

int ne, gg;
vector<int> v[100005];
int depth[100005];
int n, a, b, da, db, diam;

int dfs (int node, int par) {

	ne = node;

	int tt = 0;
	for (int i = 0; i < v[node].size(); i++) {
		int next = v[node][i];

		if (next != par) {
			tt = max (tt, dfs (next, node));
		}
	}

	tt++;
	return tt;

}

// void dis (int node, int par, int dep) {

// 	depth[node] = dep;

// 	for (int i = 0; i < v[node].size(); i++) {
// 		int next = v[node][i];

// 		if (next != par) {
// 			dis(next, node, dep + 1);
// 		}
// 	}
// }

int dfs2(int x, int p) {
	int len = 0;
	for (int y : v[x]) {
		if (y != p) {
			depth[y] = depth[x] + 1;
			int cur = 1 + dfs2(y, x);
			diam = max(diam, cur + len);
			len = max(len, cur);
		}
	}
	return len;
}

int main() {

	int t;
	cin >> t;
	int k = 0;
	while (t--) {
		k++;

		cin >> n >> a >> b >> da >> db;
		gg = 1, ne = 1, diam = 0 ;

		for (int i = 0; i < n - 1; i++) {
			int x, y;
			cin >> x >> y;
			v[x].push_back(y);
			v[y].push_back(x);
		}

		// dis(a, 0, 0);

		dfs2(a, 0);

		if (k == 173) {
			cout << n << " ";
			for (int i = 1; i <= n; i++) {
				cout << i << " ";
				for (int j = 0; j < v[i].size(); j++)
					cout << v[i][j];
			}
			cout << "  ";
		}
		int ab_dis = abs(depth[b]);

		dfs(ne, 0);

		diam = dfs(ne, 0) - 1;

		// debug(diam);

		string ans;

		// for (int i = 1; i <= n; i++) {
		// 	debug2(i, depth[i]);
		// }

		if (ab_dis <= da)
			ans = "Alice";
		else if (diam <= 2 * da)
			ans = "Alice";
		else if (db <= 2 * da)
			ans = "Alice";
		else
			ans = "Bob";

		for (int i = 0; i <= n; i++) {
			v[i].clear();
			depth[i] = 0;
		}
		cout << ans << endl ;
	}
}


#include <iostream>
#include <bits/stdc++.h>
using namespace std;
#define mod 1000000007
#define pb(x) push_back(x)
#define mp(x,y) make_pair(x,y)
#define X first
#define Y second
typedef long long  ll;
typedef pair<int , int> pp;
#define debug(x) cout<<#x<<" :: "<<x<<"\n";
#define debug2(x,y) cout<<#x<<" :: "<<x<<"\t"<<#y<<" :: "<<y<<"\n";
#define debug3(x,y,z) cout<<#x<<" :: "<<x<<"\t"<<#y<<" :: "<<y<<"\t"<<#z<<" :: "<<z<<"\n";
#define fastIO ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0)
const int N = 1e6 + 1;

int n, t = 1, a, b, da, db, mmax = 0 ;
int lev[N];

int vis[N];
int gg = 1, rr;
vector<int> v[N];

int dfs (int node, int par, int dep) {

	lev[node] = dep;
	rr = node;
	vis[node] = 1;

	if (node == a ) {

		if (vis[b] == 1)
			gg = -1;
	}

	if (node == b) {
		if (vis[a] == 1)
			gg = -1;
	}
	int tt = 0;
	for (int i = 0; i < v[node].size(); i++) {
		int next = v[node][i];
		if (vis[next] == 0) {
			tt = max (tt, dfs(next, node, dep + 1));
		}
	}

	vis[node] = 0;
	tt++;
	return tt;

}

int main() {

	fastIO;
	cin >> t;

	int tt = 0;

	while (t--) {
		tt++;

		if (tt == 173) {
			cout << n << endl;
			debug2(da, db);
			// for (int i=0; i<=n; i++)
		}

		mmax = 0;
		string ans = "Alice";
		gg = 1;
		cin >> n >> a >> b >> da >> db;

		for (int i = 1; i < n; i++) {
			int x, y;
			cin >> x >> y;
			v[x].pb(y);
			v[y].pb(x);
		}

		dfs(1, 0, 0);

		for (int i = 0; i <= n; i++)
			vis[i] = 0;

		// debug3(lev[a], 	lev[b], gg);

		int ggg = dfs(rr, 0, 0) - 1;
		// debug(ggg);

		if (abs (lev[a] + gg * lev[b]) <= da)
			ans = "Alice";

		else if (ggg <= 2 * da)
			ans = "Alice";
		else if (db <= 2 * da)
			ans = "Alice";
		else
			ans = "Bob";

		cout << ans << endl;
		for (int i = 0; i <= n; i++) {
			v[i].clear();
			lev[i] = 0;
			vis[i] = 0;
		}
	}
}


#include <iostream>
#include <bits/stdc++.h>
using namespace std;
#define debug(x) cout<<#x<<" :: "<<x<<"\n";
#define debug2(x,y) cout<<#x<<" :: "<<x<<"\t"<<#y<<" :: "<<y<<"\n";
#define debug3(x,y,z) cout<<#x<<" :: "<<x<<"\t"<<#y<<" :: "<<y<<"\t"<<#z<<" :: "<<z<<"\n";

int ne, gg;
vector<int> v[100005];
int depth[100005];
int n, a, b, da, db, diam;

int dfs (int node, int par) {

	ne = node;

	int tt = 0;
	for (int i = 0; i < v[node].size(); i++) {
		int next = v[node][i];

		if (next != par) {
			tt = max (tt, dfs (next, node));
		}
	}

	tt++;
	return tt;

}

// void dis (int node, int par, int dep) {

// 	depth[node] = dep;

// 	for (int i = 0; i < v[node].size(); i++) {
// 		int next = v[node][i];

// 		if (next != par) {
// 			dis(next, node, dep + 1);
// 		}
// 	}
// }

int dfs2(int x, int p) {
	int len = 0;
	for (int y : v[x]) {
		if (y != p) {
			depth[y] = depth[x] + 1;
			int cur = 1 + dfs2(y, x);
			diam = max(diam, cur + len);
			len = max(len, cur);
		}
	}
	return len;
}

int main() {

	int t;
	cin >> t;
	int k = 0;
	while (t--) {
		k++;

		cin >> n >> a >> b >> da >> db;
		gg = 1, ne = 1, diam = 0 ;

		for (int i = 0; i < n - 1; i++) {
			int x, y;
			cin >> x >> y;
			v[x].push_back(y);
			v[y].push_back(x);
		}

		// dis(a, 0, 0);

		dfs2(a, 0);

		if (k == 173) {
			cout << diam;
		}
		int ab_dis = abs(depth[b]);

		dfs(ne, 0);

		diam = dfs(ne, 0) - 1;
		if (k == 173) {
			cout << diam;
		}

		// debug(diam);

		string ans;

		// for (int i = 1; i <= n; i++) {
		// 	debug2(i, depth[i]);
		// }

		if (ab_dis <= da)
			ans = "Alice";
		else if (diam <= 2 * da)
			ans = "Alice";
		else if (db <= 2 * da)
			ans = "Alice";
		else
			ans = "Bob";

		for (int i = 0; i <= n; i++) {
			v[i].clear();
			depth[i] = 0;
		}
		cout << ans << endl ;
	}
}


#include <iostream>
#include <bits/stdc++.h>
using namespace std;
#define debug(x) cout<<#x<<" :: "<<x<<"\n";
#define debug2(x,y) cout<<#x<<" :: "<<x<<"\t"<<#y<<" :: "<<y<<"\n";
#define debug3(x,y,z) cout<<#x<<" :: "<<x<<"\t"<<#y<<" :: "<<y<<"\t"<<#z<<" :: "<<z<<"\n";

int ne, gg;
vector<int> v[100005];
int depth[100005];
int n, a, b, da, db, diam;

int dfs (int node, int par) {

	ne = node;

	int tt = 0;
	for (int i = 0; i < v[node].size(); i++) {
		int next = v[node][i];

		if (next != par) {
			tt = max (tt, dfs (next, node));
		}
	}

	tt++;
	return tt;

}

// void dis (int node, int par, int dep) {

// 	depth[node] = dep;

// 	for (int i = 0; i < v[node].size(); i++) {
// 		int next = v[node][i];

// 		if (next != par) {
// 			dis(next, node, dep + 1);
// 		}
// 	}
// }

int dfs2(int x, int p) {
	int len = 0;
	for (int y : v[x]) {
		if (y != p) {
			depth[y] = depth[x] + 1;
			int cur = 1 + dfs2(y, x);
			diam = max(diam, cur + len);
			len = max(len, cur);
		}
	}
	return len;
}

int main() {

	int t;
	cin >> t;
	int k = 0;
	while (t--) {
		k++;

		cin >> n >> a >> b >> da >> db;
		gg = 1, ne = 1, diam = 0 ;

		for (int i = 0; i < n - 1; i++) {
			int x, y;
			cin >> x >> y;
			v[x].push_back(y);
			v[y].push_back(x);
		}

		// dis(a, 0, 0);

		dfs2(a, 0);

		if (k == 173) {
			cout << n;
			for (int i = 1; i <= n; i++) {
				cout << i ;
				for (int j = 0; j < v[i].size(); j++)
					cout << v[i][j];
			}
		}
		int ab_dis = abs(depth[b]);

		dfs(ne, 0);

		diam = dfs(ne, 0) - 1;

		// debug(diam);

		string ans;

		// for (int i = 1; i <= n; i++) {
		// 	debug2(i, depth[i]);
		// }

		if (ab_dis <= da)
			ans = "Alice";
		else if (diam <= 2 * da)
			ans = "Alice";
		else if (db <= 2 * da)
			ans = "Alice";
		else
			ans = "Bob";

		for (int i = 0; i <= n; i++) {
			v[i].clear();
			depth[i] = 0;
		}
		cout << ans << endl ;
	}
}