#include <bits/stdc++.h>
using namespace std;
#define F first
#define S second
#define PB push_back
#define PF push_front
#define P push
#define INC(i,a,b) for (ll i = a; i <= b; i++)
#define DEC(i,b,a) for (ll i = b; i >= a ; i--)
#define inf LLONG_MAX
#define neginf LLONG_MIN
#define mod  1000000007
#define eps 1e-9
typedef ostringstream OS ;
typedef stringstream SS ;
typedef long long ll ;
typedef unsigned long long ull;
typedef pair < ll , ll > PLL ;
typedef pair < char,ll > PCL ;
typedef deque < double > DD ;
typedef deque < PCL > DCL ;
typedef deque < ll > DL ;
typedef deque < PLL > DLL ;
typedef deque < char > DC ;
typedef deque < string > DS ;
typedef vector < double > VD;
typedef vector < PCL > VCL ;
typedef vector < ll > VL;
typedef vector < PLL > VLL ;
typedef vector < char > VC ;
typedef vector < string > VS ;
typedef map < ll ,ll > MLL ;
typedef map < char,ll > MCL;
typedef map < ll,char > MLC;
typedef map < string,ll> MSL;
typedef priority_queue < PLL > PQLL ;
typedef priority_queue < ll > PQL ;
typedef stack < ll > SKL ;
typedef stack < PLL > SKLL ;
typedef queue < ll > QL ;
typedef queue < PLL > QLL ;
typedef set < ll > SL ;
typedef set < PLL > SLL ;
typedef set < char > SC ;

string numtostr(ll n) {
     OS str1 ;
     str1 << n ;
     return str1.str();
}
ll strtonum(string s) {
     ll x ;
     SS str1(s);
     str1 >> x ;
     return x ;
}
ll GCD(ll a, ll b) {
    if ( b == 0 ) return a ;
    else return GCD(b,a%b);
}
ll LCM(ll a , ll b) {
    ll gcd = GCD(a,b);
     return (a/gcd)*b ;
}
VL visited,dis ;
vector < VL > graph ;
void setting(ll n) {
    visited.clear();
    dis.clear();
    graph.clear();
    visited.resize(n+5,0);
    dis.resize(n+5,0);
    graph.resize(n+5);
}
void dfs(ll node, ll parent ,ll durotto) {
    dis[node] = durotto;
    for ( ll child : graph[node]) {
        if ( child == parent) continue;
        dfs(child,node,durotto+1);
    }
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    ll t ;
    cin >> t ;
    while(t--) {
        ll n,a,b,da,db ;
        cin >> n >> a >> da >> b >> db ;
        setting(n);
        INC(i,1,n-1) {
            ll node1,node2 ;
            cin >> node1 >> node2;
            graph[node1].PB(node2);
            graph[node2].PB(node1);
        }

        dfs(a,-1,0);
        if (dis[b] <= da ) {
            cout << "Alice" << endl;
            continue ;
        }
        ll maximum = -1 ;
        ll furthestnode = -1 ;
        INC(i,1,n) if ( dis[i] > maximum) {
            maximum = dis[i];
            furthestnode = i ;
        }
        visited.clear();
        dis.clear();
        visited.resize(n+5,0);
        dis.resize(n+5,0);
        dfs(furthestnode,-1,0);
        ll treediameter = -1 ;
        INC(i,1,n) treediameter = max(treediameter,dis[i]);
        if ( treediameter <= 2*da || db <= 2*da  )  {
            cout << "Alice" << endl;
            continue ;
        }
        cout << "Bob" << endl;
    }

    return 0 ;
}


#include <bits/stdc++.h>
using namespace std;
#define F first
#define S second
#define PB push_back
#define PF push_front
#define P push
#define INC(i,a,b) for (ll i = a; i <= b; i++)
#define DEC(i,b,a) for (ll i = b; i >= a ; i--)
#define inf LLONG_MAX
#define neginf LLONG_MIN
#define mod  1000000007
#define eps 1e-9
typedef ostringstream OS ;
typedef stringstream SS ;
typedef long long ll ;
typedef unsigned long long ull;
typedef pair < ll , ll > PLL ;
typedef pair < char,ll > PCL ;
typedef deque < double > DD ;
typedef deque < PCL > DCL ;
typedef deque < ll > DL ;
typedef deque < PLL > DLL ;
typedef deque < char > DC ;
typedef deque < string > DS ;
typedef vector < double > VD;
typedef vector < PCL > VCL ;
typedef vector < ll > VL;
typedef vector < PLL > VLL ;
typedef vector < char > VC ;
typedef vector < string > VS ;
typedef map < ll ,ll > MLL ;
typedef map < char,ll > MCL;
typedef map < ll,char > MLC;
typedef map < string,ll> MSL;
typedef priority_queue < PLL > PQLL ;
typedef priority_queue < ll > PQL ;
typedef stack < ll > SKL ;
typedef stack < PLL > SKLL ;
typedef queue < ll > QL ;
typedef queue < PLL > QLL ;
typedef set < ll > SL ;
typedef set < PLL > SLL ;
typedef set < char > SC ;

string numtostr(ll n) {
     OS str1 ;
     str1 << n ;
     return str1.str();
}
ll strtonum(string s) {
     ll x ;
     SS str1(s);
     str1 >> x ;
     return x ;
}
ll GCD(ll a, ll b) {
    if ( b == 0 ) return a ;
    else return GCD(b,a%b);
}
ll LCM(ll a , ll b) {
    ll gcd = GCD(a,b);
     return (a/gcd)*b ;
}
VL visited,dis ;
vector < VL > graph ;
void setting(ll n) {
    visited.clear();
    dis.clear();
    graph.clear();
    visited.resize(n+5,0);
    dis.resize(n+5,0);
    graph.resize(n+5);
}
void dfs(ll node, ll parent ,ll durotto) {
    dis[node] = durotto;
    for ( ll child : graph[node]) {
        if ( child == parent) continue;
        dfs(child,node,durotto+1);
    }
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    ll t ;
    cin >> t ;
    while(t--) {
        ll n,a,b,da,db ;
        cin >> n >> a >> da >> b >> db ;
        setting(n);
        INC(i,1,n-1) {
            ll node1,node2 ;
            cin >> node1 >> node2;
            graph[node1].PB(node2);
            graph[node2].PB(node1);
        }

        dfs(a,-1,0);
        if (dis[b] <= da ) {
            cout << "Alice" << endl;
            continue ;
        }
        ll maximum = -1 ;
        ll furthestnode = -1 ;
        INC(i,1,n) if ( i != a && dis[i] > maximum) {
            maximum = dis[i];
            furthestnode = i ;
        }
        visited.clear();
        dis.clear();
        visited.resize(n+5,0);
        dis.resize(n+5,0);
        dfs(furthestnode,-1,0);
        ll treediameter = -1 ;
        INC(i,1,n) if ( i != furthestnode ) treediameter = max(treediameter,dis[i]);
        if ( treediameter <= 2*da || db <= 2*da  )  {
            cout << "Alice" << endl;
            continue ;
        }
        cout << "Bob" << endl;
    }

    return 0 ;
}


#include <bits/stdc++.h>
using namespace std;
#define F first
#define S second
#define PB push_back
#define PF push_front
#define P push
#define INC(i,a,b) for (ll i = a; i <= b; i++)
#define DEC(i,b,a) for (ll i = b; i >= a ; i--)
#define inf LLONG_MAX
#define neginf LLONG_MIN
#define mod  1000000007
#define eps 1e-9
typedef ostringstream OS ;
typedef stringstream SS ;
typedef long long ll ;
typedef unsigned long long ull;
typedef pair < ll , ll > PLL ;
typedef pair < char,ll > PCL ;
typedef deque < double > DD ;
typedef deque < PCL > DCL ;
typedef deque < ll > DL ;
typedef deque < PLL > DLL ;
typedef deque < char > DC ;
typedef deque < string > DS ;
typedef vector < double > VD;
typedef vector < PCL > VCL ;
typedef vector < ll > VL;
typedef vector < PLL > VLL ;
typedef vector < char > VC ;
typedef vector < string > VS ;
typedef map < ll ,ll > MLL ;
typedef map < char,ll > MCL;
typedef map < ll,char > MLC;
typedef map < string,ll> MSL;
typedef priority_queue < PLL > PQLL ;
typedef priority_queue < ll > PQL ;
typedef stack < ll > SKL ;
typedef stack < PLL > SKLL ;
typedef queue < ll > QL ;
typedef queue < PLL > QLL ;
typedef set < ll > SL ;
typedef set < PLL > SLL ;
typedef set < char > SC ;

string numtostr(ll n) {
     OS str1 ;
     str1 << n ;
     return str1.str();
}
ll strtonum(string s) {
     ll x ;
     SS str1(s);
     str1 >> x ;
     return x ;
}
ll GCD(ll a, ll b) {
    if ( b == 0 ) return a ;
    else return GCD(b,a%b);
}
ll LCM(ll a , ll b) {
    ll gcd = GCD(a,b);
     return (a/gcd)*b ;
}
vector < VL > graph ;
ll n,a,b,da,db,distancetob ,maximumdurotto1,treediameter,furthestnode;
ll fact ;
void setting(ll n) {
    graph.clear();
    graph.resize(n+5);
    fact = 0 ;
    distancetob = -1;
    maximumdurotto1 = -1 ;
    treediameter = -1 ;
    furthestnode = -1 ;
}
void dfs(ll node, ll parent ,ll durotto) {
    if ( fact == 1) {
        if ( node == b) distancetob = durotto ;
        if ( durotto > maximumdurotto1) {
            maximumdurotto1 = durotto ;
            furthestnode = node ;
        }
    }
    else if ( fact == 2) treediameter = max(treediameter,durotto);

    for ( ll child : graph[node]) {
        if ( child == parent) continue;
        dfs(child,node,durotto+1);
    }
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    ll t ;
    cin >> t ;
    while(t--) {
        cin >> n >> a >> da >> b >> db ;
        setting(n);
        INC(i,1,n-1) {
            ll node1,node2 ;
            cin >> node1 >> node2;
            graph[node1].PB(node2);
            graph[node2].PB(node1);
        }
        fact++ ;
        dfs(a,-1,0);
        if (distancetob <= da ) {
            cout << "Alice" << endl;
            continue ;
        }
        fact++ ;
        dfs(furthestnode,-1,0);
        if ( treediameter <= 2*da || db <= 2*da  )  {
            cout << "Alice" << endl;
            continue ;
        }
        cout << "Bob" << endl;
    }

    return 0 ;
}


#include <bits/stdc++.h>
using namespace std;
#define F first
#define S second
#define PB push_back
#define PF push_front
#define P push
#define INC(i,a,b) for (ll i = a; i <= b; i++)
#define DEC(i,b,a) for (ll i = b; i >= a ; i--)
#define inf LLONG_MAX
#define neginf LLONG_MIN
#define mod  1000000007
#define eps 1e-9
typedef ostringstream OS ;
typedef stringstream SS ;
typedef long long ll ;
typedef unsigned long long ull;
typedef pair < ll , ll > PLL ;
typedef pair < char,ll > PCL ;
typedef deque < double > DD ;
typedef deque < PCL > DCL ;
typedef deque < ll > DL ;
typedef deque < PLL > DLL ;
typedef deque < char > DC ;
typedef deque < string > DS ;
typedef vector < double > VD;
typedef vector < PCL > VCL ;
typedef vector < ll > VL;
typedef vector < PLL > VLL ;
typedef vector < char > VC ;
typedef vector < string > VS ;
typedef map < ll ,ll > MLL ;
typedef map < char,ll > MCL;
typedef map < ll,char > MLC;
typedef map < string,ll> MSL;
typedef priority_queue < PLL > PQLL ;
typedef priority_queue < ll > PQL ;
typedef stack < ll > SKL ;
typedef stack < PLL > SKLL ;
typedef queue < ll > QL ;
typedef queue < PLL > QLL ;
typedef set < ll > SL ;
typedef set < PLL > SLL ;
typedef set < char > SC ;

string numtostr(ll n) {
     OS str1 ;
     str1 << n ;
     return str1.str();
}
ll strtonum(string s) {
     ll x ;
     SS str1(s);
     str1 >> x ;
     return x ;
}
ll GCD(ll a, ll b) {
    if ( b == 0 ) return a ;
    else return GCD(b,a%b);
}
ll LCM(ll a , ll b) {
    ll gcd = GCD(a,b);
     return (a/gcd)*b ;
}
VL visited,dis ;
vector < VL > graph ;
void setting(ll n) {
    visited.clear();
    dis.clear();
    graph.clear();
    visited.resize(n+5,0);
    dis.resize(n+5,0);
    graph.resize(n+5);
}
void dfs(ll node, ll durotto) {
    visited[node] = 1 ;
    dis[node] = durotto;
    for ( ll child : graph[node]) {
        if (!visited[child]) {
            dfs(child,durotto+1);
        }
    }
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    ll t ;
    cin >> t ;
    while(t--) {
        ll n,a,b,da,db ;
        cin >> n >> a >> da >> b >> db ;
        setting(n);
        INC(i,1,n-1) {
            ll node1,node2 ;
            cin >> node1 >> node2;
            graph[node1].PB(node2);
            graph[node2].PB(node1);
        }

        dfs(a,0);
        if (dis[b] <= da ) {
            cout << "Alice" << endl;
            continue ;
        }
        ll maximum = 0 ;
        ll furthestnode = -1 ;
        INC(i,1,n) if ( dis[i] > maximum) {
            maximum = dis[i];
            furthestnode = i ;
        }
        visited.clear();
        dis.clear();
        visited.resize(n+5,0);
        dis.resize(n+5,0);
        dfs(furthestnode,0);
        ll treediameter = 0 ;
        INC(i,1,n) treediameter = max(treediameter,dis[i]);
        if ( treediameter <= 2*da || db <= 2*da  )  {
            cout << "Alice" << endl;
            continue ;
        }
        cout << "Bob" << endl;
    }

    return 0 ;
}


#include <bits/stdc++.h>
using namespace std;
#define F first
#define S second
#define PB push_back
#define PF push_front
#define P push
#define INC(i,a,b) for (ll i = a; i <= b; i++)
#define DEC(i,b,a) for (ll i = b; i >= a ; i--)
#define inf LLONG_MAX
#define neginf LLONG_MIN
#define mod  1000000007
#define eps 1e-9
typedef ostringstream OS ;
typedef stringstream SS ;
typedef long long ll ;
typedef unsigned long long ull;
typedef pair < ll , ll > PLL ;
typedef pair < char,ll > PCL ;
typedef deque < double > DD ;
typedef deque < PCL > DCL ;
typedef deque < ll > DL ;
typedef deque < PLL > DLL ;
typedef deque < char > DC ;
typedef deque < string > DS ;
typedef vector < double > VD;
typedef vector < PCL > VCL ;
typedef vector < ll > VL;
typedef vector < PLL > VLL ;
typedef vector < char > VC ;
typedef vector < string > VS ;
typedef map < ll ,ll > MLL ;
typedef map < char,ll > MCL;
typedef map < ll,char > MLC;
typedef map < string,ll> MSL;
typedef priority_queue < PLL > PQLL ;
typedef priority_queue < ll > PQL ;
typedef stack < ll > SKL ;
typedef stack < PLL > SKLL ;
typedef queue < ll > QL ;
typedef queue < PLL > QLL ;
typedef set < ll > SL ;
typedef set < PLL > SLL ;
typedef set < char > SC ;

string numtostr(ll n) {
     OS str1 ;
     str1 << n ;
     return str1.str();
}
ll strtonum(string s) {
     ll x ;
     SS str1(s);
     str1 >> x ;
     return x ;
}
ll GCD(ll a, ll b) {
    if ( b == 0 ) return a ;
    else return GCD(b,a%b);
}
ll LCM(ll a , ll b) {
    ll gcd = GCD(a,b);
     return (a/gcd)*b ;
}
VL visited,dis ;
vector < VL > graph ;
void setting(ll n) {
    visited.clear();
    dis.clear();
    graph.clear();
    visited.resize(n+5,0);
    dis.resize(n+5,0);
    graph.resize(n+5);
}
void dfs(ll node) {
    visited[node] = 1 ;
    for ( ll child : graph[node]) {
        if (!visited[child]) {
            dis[child] = dis[node]+1 ;
            dfs(child);
        }
    }
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    ll t ;
    cin >> t ;
    while(t--) {
        ll n,a,b,da,db ;
        cin >> n >> a >> da >> b >> db ;
        setting(n);
        INC(i,1,n-1) {
            ll node1,node2 ;
            cin >> node1 >> node2;
            graph[node1].PB(node2);
            graph[node2].PB(node1);
        }

        dfs(a);
        ll distancefromatob = dis[b];
        ll maximum = 0 ;
        ll furthestnode = -1 ;
        INC(i,1,n) if ( dis[i] > maximum) {
            maximum = dis[i];
            furthestnode = i ;
        }
        visited.clear();
        dis.clear();
        visited.resize(n+5,0);
        dis.resize(n+5,0);
        dfs(furthestnode);
        ll treediameter = 0 ;
        INC(i,1,n) if ( dis[i] > treediameter) treediameter = dis[i];
        ll fact = 0 ;
        if ( distancefromatob <= da  || treediameter <= 2*da )  fact = 1 ;
        if ( fact == 0 && db > 2*da) cout << "Bob" << endl;
        else cout << "Alice" << endl;
    }

    return 0 ;
}


#include <bits/stdc++.h>
using namespace std;
#define F first
#define S second
#define PB push_back
#define PF push_front
#define P push
#define INC(i,a,b) for (ll i = a; i <= b; i++)
#define DEC(i,b,a) for (ll i = b; i >= a ; i--)
#define inf LLONG_MAX
#define neginf LLONG_MIN
#define mod  1000000007
#define eps 1e-9
typedef ostringstream OS ;
typedef stringstream SS ;
typedef long long ll ;
typedef unsigned long long ull;
typedef pair < ll , ll > PLL ;
typedef pair < char,ll > PCL ;
typedef deque < double > DD ;
typedef deque < PCL > DCL ;
typedef deque < ll > DL ;
typedef deque < PLL > DLL ;
typedef deque < char > DC ;
typedef deque < string > DS ;
typedef vector < double > VD;
typedef vector < PCL > VCL ;
typedef vector < ll > VL;
typedef vector < PLL > VLL ;
typedef vector < char > VC ;
typedef vector < string > VS ;
typedef map < ll ,ll > MLL ;
typedef map < char,ll > MCL;
typedef map < ll,char > MLC;
typedef map < string,ll> MSL;
typedef priority_queue < PLL > PQLL ;
typedef priority_queue < ll > PQL ;
typedef stack < ll > SKL ;
typedef stack < PLL > SKLL ;
typedef queue < ll > QL ;
typedef queue < PLL > QLL ;
typedef set < ll > SL ;
typedef set < PLL > SLL ;
typedef set < char > SC ;

string numtostr(ll n) {
     OS str1 ;
     str1 << n ;
     return str1.str();
}
ll strtonum(string s) {
     ll x ;
     SS str1(s);
     str1 >> x ;
     return x ;
}
ll GCD(ll a, ll b) {
    if ( b == 0 ) return a ;
    else return GCD(b,a%b);
}
ll LCM(ll a , ll b) {
    ll gcd = GCD(a,b);
     return (a/gcd)*b ;
}
VL visited,dis ;
vector < VL > graph ;
void setting(ll n) {
    visited.clear();
    dis.clear();
    graph.clear();
    visited.resize(n+5,0);
    dis.resize(n+5,0);
    graph.resize(n+5);
}
void dfs(ll node, ll durotto) {
    visited[node] = 1 ;
    dis[node] = durotto;
    for ( ll child : graph[node]) {
        if (!visited[child]) {
            dfs(child,durotto+1);
        }
    }
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    ll t ;
    cin >> t ;
    while(t--) {
        ll n,a,b,da,db ;
        cin >> n >> a >> da >> b >> db ;
        setting(n);
        INC(i,1,n-1) {
            ll node1,node2 ;
            cin >> node1 >> node2;
            graph[node1].PB(node2);
            graph[node2].PB(node1);
        }

        dfs(a,0);

        ll distancefromatob = dis[b];
        ll maximum = 0 ;
        ll furthestnode = -1 ;
        INC(i,1,n) if ( dis[i] > maximum) {
            maximum = dis[i];
            furthestnode = i ;
        }
        visited.clear();
        dis.clear();
        visited.resize(n+5,0);
        dis.resize(n+5,0);
        dfs(furthestnode,0);
        ll treediameter = 0 ;
        INC(i,1,n) if ( dis[i] > treediameter) treediameter = dis[i];
        ll fact = 0 ;
        if ( distancefromatob <= da  || treediameter <= 2*da )  fact = 1 ;
        if ( fact == 0 && db > 2*da) cout << "Bob" << endl;
        else cout << "Alice" << endl;
    }

    return 0 ;
}


#include <bits/stdc++.h>
using namespace std;
#define F first
#define S second
#define PB push_back
#define PF push_front
#define P push
#define INC(i,a,b) for (ll i = a; i <= b; i++)
#define DEC(i,b,a) for (ll i = b; i >= a ; i--)
#define inf LLONG_MAX
#define neginf LLONG_MIN
#define mod  1000000007
#define eps 1e-9
typedef ostringstream OS ;
typedef stringstream SS ;
typedef long long ll ;
typedef unsigned long long ull;
typedef pair < ll , ll > PLL ;
typedef pair < char,ll > PCL ;
typedef deque < double > DD ;
typedef deque < PCL > DCL ;
typedef deque < ll > DL ;
typedef deque < PLL > DLL ;
typedef deque < char > DC ;
typedef deque < string > DS ;
typedef vector < double > VD;
typedef vector < PCL > VCL ;
typedef vector < ll > VL;
typedef vector < PLL > VLL ;
typedef vector < char > VC ;
typedef vector < string > VS ;
typedef map < ll ,ll > MLL ;
typedef map < char,ll > MCL;
typedef map < ll,char > MLC;
typedef map < string,ll> MSL;
typedef priority_queue < PLL > PQLL ;
typedef priority_queue < ll > PQL ;
typedef stack < ll > SKL ;
typedef stack < PLL > SKLL ;
typedef queue < ll > QL ;
typedef queue < PLL > QLL ;
typedef set < ll > SL ;
typedef set < PLL > SLL ;
typedef set < char > SC ;

string numtostr(ll n) {
     OS str1 ;
     str1 << n ;
     return str1.str();
}
ll strtonum(string s) {
     ll x ;
     SS str1(s);
     str1 >> x ;
     return x ;
}
ll GCD(ll a, ll b) {
    if ( b == 0 ) return a ;
    else return GCD(b,a%b);
}
ll LCM(ll a , ll b) {
    ll gcd = GCD(a,b);
     return (a/gcd)*b ;
}
VL visited,dis ;
vector < VL > graph ;
void setting(ll n) {
    visited.clear();
    dis.clear();
    graph.clear();
    visited.resize(n+5,0);
    dis.resize(n+5,0);
    graph.resize(n+5);
}
void dfs(ll node, ll durotto) {
    visited[node] = 1 ;
    dis[node] = durotto;
    for ( ll child : graph[node]) {
        if (!visited[child]) {
            dfs(child,durotto+1);
        }
    }
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    ll t ;
    cin >> t ;
    while(t--) {
        ll n,a,b,da,db ;
        cin >> n >> a >> da >> b >> db ;
        setting(n);
        INC(i,1,n-1) {
            ll node1,node2 ;
            cin >> node1 >> node2;
            graph[node1].PB(node2);
            graph[node2].PB(node1);
        }

        dfs(a,0);

        ll distancefromatob = dis[b];
        ll maximum = 0 ;
        ll furthestnode = -1 ;
        INC(i,1,n) if ( dis[i] > maximum) {
            maximum = dis[i];
            furthestnode = i ;
        }
        visited.clear();
        dis.clear();
        visited.resize(n+5,0);
        dis.resize(n+5,0);
        dfs(furthestnode,0);
        ll treediameter = 0 ;
        INC(i,1,n) treediameter = max(treediameter,dis[i]);
        if (distancefromatob <= da ) cout << "Alice" << endl;
        else {
            if ( (treediameter+1)/2 <= da || db <= 2*da  )  cout << "Alice" << endl;
            else cout << "Bob" << endl;
        }
    }

    return 0 ;
}


#include <bits/stdc++.h>
using namespace std;
#define F first
#define S second
#define PB push_back
#define PF push_front
#define P push
#define INC(i,a,b) for (ll i = a; i <= b; i++)
#define DEC(i,b,a) for (ll i = b; i >= a ; i--)
#define inf LLONG_MAX
#define neginf LLONG_MIN
#define mod  1000000007
#define eps 1e-9
typedef ostringstream OS ;
typedef stringstream SS ;
typedef long long ll ;
typedef unsigned long long ull;
typedef pair < ll , ll > PLL ;
typedef pair < char,ll > PCL ;
typedef deque < double > DD ;
typedef deque < PCL > DCL ;
typedef deque < ll > DL ;
typedef deque < PLL > DLL ;
typedef deque < char > DC ;
typedef deque < string > DS ;
typedef vector < double > VD;
typedef vector < PCL > VCL ;
typedef vector < ll > VL;
typedef vector < PLL > VLL ;
typedef vector < char > VC ;
typedef vector < string > VS ;
typedef map < ll ,ll > MLL ;
typedef map < char,ll > MCL;
typedef map < ll,char > MLC;
typedef map < string,ll> MSL;
typedef priority_queue < PLL > PQLL ;
typedef priority_queue < ll > PQL ;
typedef stack < ll > SKL ;
typedef stack < PLL > SKLL ;
typedef queue < ll > QL ;
typedef queue < PLL > QLL ;
typedef set < ll > SL ;
typedef set < PLL > SLL ;
typedef set < char > SC ;

string numtostr(ll n) {
     OS str1 ;
     str1 << n ;
     return str1.str();
}
ll strtonum(string s) {
     ll x ;
     SS str1(s);
     str1 >> x ;
     return x ;
}
ll GCD(ll a, ll b) {
    if ( b == 0 ) return a ;
    else return GCD(b,a%b);
}
ll LCM(ll a , ll b) {
    ll gcd = GCD(a,b);
     return (a/gcd)*b ;
}
vector < VL > graph ;
ll n,a,b,da,db,distancetob ,maximumdurotto1,treediameter,furthestnode;
ll fact ;
void setting(ll n) {
    graph.clear();
    graph.resize(n+5);
    fact = 0 ;
    distancetob = -1;
    maximumdurotto1 = -1 ;
    treediameter = -1 ;
    furthestnode = -1 ;
}
void dfs(ll node, ll parent ,ll durotto) {
    if ( fact == 1) {
        if ( node == b) distancetob = durotto ;
        if ( durotto > maximumdurotto1) {
            maximumdurotto1 = durotto ;
            furthestnode = node ;
        }
    }
    else if ( fact == 2) treediameter = max(treediameter,durotto);

    for ( ll child : graph[node]) {
        if ( child == parent) continue;
        dfs(child,node,durotto+1);
    }
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    ll t ;
    cin >> t ;
    while(t--) {
        cin >> n >> a >> b >> da >> db ;
        setting(n);
        INC(i,1,n-1) {
            ll node1,node2 ;
            cin >> node1 >> node2;
            graph[node1].PB(node2);
            graph[node2].PB(node1);
        }
        fact++ ;
        dfs(a,-1,0);
        if (distancetob <= da ) {
            cout << "Alice" << endl;
            continue ;
        }
        fact++ ;
        dfs(furthestnode,-1,0);
        if ( treediameter <= 2*da || db <= 2*da  )  {
            cout << "Alice" << endl;
            continue ;
        }
        cout << "Bob" << endl;
    }

    return 0 ;
}


#include <bits/stdc++.h>
using namespace std;
#define F first
#define S second
#define PB push_back
#define PF push_front
#define P push
#define INC(i,a,b) for (ll i = a; i <= b; i++)
#define DEC(i,b,a) for (ll i = b; i >= a ; i--)
#define inf LLONG_MAX
#define neginf LLONG_MIN
#define mod  1000000007
#define eps 1e-9
typedef ostringstream OS ;
typedef stringstream SS ;
typedef long long ll ;
typedef unsigned long long ull;
typedef pair < ll , ll > PLL ;
typedef pair < char,ll > PCL ;
typedef deque < double > DD ;
typedef deque < PCL > DCL ;
typedef deque < ll > DL ;
typedef deque < PLL > DLL ;
typedef deque < char > DC ;
typedef deque < string > DS ;
typedef vector < double > VD;
typedef vector < PCL > VCL ;
typedef vector < ll > VL;
typedef vector < PLL > VLL ;
typedef vector < char > VC ;
typedef vector < string > VS ;
typedef map < ll ,ll > MLL ;
typedef map < char,ll > MCL;
typedef map < ll,char > MLC;
typedef map < string,ll> MSL;
typedef priority_queue < PLL > PQLL ;
typedef priority_queue < ll > PQL ;
typedef stack < ll > SKL ;
typedef stack < PLL > SKLL ;
typedef queue < ll > QL ;
typedef queue < PLL > QLL ;
typedef set < ll > SL ;
typedef set < PLL > SLL ;
typedef set < char > SC ;

string numtostr(ll n) {
     OS str1 ;
     str1 << n ;
     return str1.str();
}
ll strtonum(string s) {
     ll x ;
     SS str1(s);
     str1 >> x ;
     return x ;
}
ll GCD(ll a, ll b) {
    if ( b == 0 ) return a ;
    else return GCD(b,a%b);
}
ll LCM(ll a , ll b) {
    ll gcd = GCD(a,b);
     return (a/gcd)*b ;
}
VL visited,dis ;
vector < VL > graph ;
void setting(ll n) {
    visited.clear();
    dis.clear();
    graph.clear();
    visited.resize(n+5,0);
    dis.resize(n+5,0);
    graph.resize(n+5);
}
void dfs(ll node, ll durotto) {
    visited[node] = 1 ;
    dis[node] = durotto;
    for ( ll child : graph[node]) {
        if (!visited[child]) {
            dfs(child,durotto+1);
        }
    }
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    ll t ;
    cin >> t ;
    while(t--) {
        ll n,a,b,da,db ;
        cin >> n >> a >> da >> b >> db ;
        setting(n);
        INC(i,1,n-1) {
            ll node1,node2 ;
            cin >> node1 >> node2;
            graph[node1].PB(node2);
            graph[node2].PB(node1);
        }

        dfs(a,0);

        ll distancefromatob = dis[b];
        ll maximum = 0 ;
        ll furthestnode = -1 ;
        INC(i,1,n) if ( dis[i] > maximum) {
            maximum = dis[i];
            furthestnode = i ;
        }
        visited.clear();
        dis.clear();
        visited.resize(n+5,0);
        dis.resize(n+5,0);
        dfs(furthestnode,0);
        ll treediameter = 0 ;
        INC(i,1,n) if ( dis[i] > treediameter) treediameter = dis[i];
        ll fact = 0 ;
        if (distancefromatob <= da ) cout << "Alice" << endl;
        else {
            if ( treediameter <= 2*da || db <= 2*da  )  cout << "Alice" << endl;
            else cout << "Bob" << endl;
        }
    }

    return 0 ;
}


#include <bits/stdc++.h>
using namespace std;
#define F first
#define S second
#define PB push_back
#define PF push_front
#define P push
#define INC(i,a,b) for (ll i = a; i <= b; i++)
#define DEC(i,b,a) for (ll i = b; i >= a ; i--)
#define inf LLONG_MAX
#define neginf LLONG_MIN
#define mod  1000000007
#define eps 1e-9
typedef ostringstream OS ;
typedef stringstream SS ;
typedef long long ll ;
typedef unsigned long long ull;
typedef pair < ll , ll > PLL ;
typedef pair < char,ll > PCL ;
typedef deque < double > DD ;
typedef deque < PCL > DCL ;
typedef deque < ll > DL ;
typedef deque < PLL > DLL ;
typedef deque < char > DC ;
typedef deque < string > DS ;
typedef vector < double > VD;
typedef vector < PCL > VCL ;
typedef vector < ll > VL;
typedef vector < PLL > VLL ;
typedef vector < char > VC ;
typedef vector < string > VS ;
typedef map < ll ,ll > MLL ;
typedef map < char,ll > MCL;
typedef map < ll,char > MLC;
typedef map < string,ll> MSL;
typedef priority_queue < PLL > PQLL ;
typedef priority_queue < ll > PQL ;
typedef stack < ll > SKL ;
typedef stack < PLL > SKLL ;
typedef queue < ll > QL ;
typedef queue < PLL > QLL ;
typedef set < ll > SL ;
typedef set < PLL > SLL ;
typedef set < char > SC ;

string numtostr(ll n) {
     OS str1 ;
     str1 << n ;
     return str1.str();
}
ll strtonum(string s) {
     ll x ;
     SS str1(s);
     str1 >> x ;
     return x ;
}
ll GCD(ll a, ll b) {
    if ( b == 0 ) return a ;
    else return GCD(b,a%b);
}
ll LCM(ll a , ll b) {
    ll gcd = GCD(a,b);
     return (a/gcd)*b ;
}
VL visited,dis ;
vector < VL > graph ;
void setting(ll n) {
    visited.clear();
    dis.clear();
    graph.clear();
    visited.resize(n+5,0);
    dis.resize(n+5,0);
    graph.resize(n+5);
}
void dfs(ll node) {
    visited[node] = 1 ;
    for ( ll child : graph[node]) {
        if (!visited[child]) {
            dis[child] = dis[node]+1 ;
            dfs(child);
        }
    }
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    ll t ;
    cin >> t ;
    while(t--) {
        ll n,a,b,da,db ;
        cin >> n >> a >> da >> b >> db ;
        setting(n);
        INC(i,1,n-1) {
            ll node1,node2 ;
            cin >> node1 >> node2;
            graph[node1].PB(node2);
            graph[node2].PB(node1);
        }
        dfs(a);
        ll distancefromatob = dis[b];
        ll maximum = 0 ;
        ll furthestnode = -1 ;
        INC(i,1,n) if ( dis[i] > maximum) {
            maximum = dis[i];
            furthestnode = i ;
        }
        visited.clear();
        dis.clear();
        visited.resize(n+5,0);
        dis.resize(n+5,0);
        dfs(furthestnode);
        ll treediameter = 0 ;
        INC(i,1,n) if ( dis[i] > treediameter) treediameter = dis[i];
        if ( distancefromatob <= da )  cout << "Alice" << endl;
        else if (treediameter <= 2*da ) cout << "Alice" << endl;
        else if (db <= 2*da) cout << "Alice" << endl;
        else  cout << "Bob" << endl;
    }

    return 0 ;
}


// link here :
#include <bits/stdc++.h>
using namespace std;

#define NAME "do"
#define show(x) cout << (#x) << " is " << (x) << endl
#define ll long long
#define ms(arr,val) memset(arr,val,sizeof(arr))
#define len length()
#define pb push_back
#define epb emplace_back

const int maxn = 1e5+5;
int n,a,b,da,db;
vector< vector<int> > adj;
int d[maxn];
ll toLeaf[maxn];
ll diam = 0;
void dfs(int pre,int u){

    for(auto v : adj[u]){
        if (v == pre) continue;
        d[v] = d[u]+1;
        dfs(u,v);
    }
    toLeaf[u]=0;
    if(adj[u].size()!=1 || u == b){
        for(auto v : adj[u]){
            if (v == pre )continue;
            toLeaf[u]  = max( toLeaf[u] , toLeaf[v] );
        }
    }
    toLeaf[u]+=1;

    int first = -1;
    int second = -1;
    for(int v  : adj[u]){
        if (first == -1 || toLeaf[first]  <= toLeaf[v] ){
            second = first ;
            first = v;
        }else{
            if ( second == - 1 || toLeaf[second] < toLeaf[v] ) second = v;
        }
    }
    ll maxl = 1;

    if(first != -1) maxl += toLeaf[first] ;
    if(second != -1) maxl += toLeaf[second];

    diam = max(diam,maxl);

}
int main(){
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    //ifstream cin(NAME".inp");
    //ofstream cout(NAME".out");
    int t;
    cin>>t;
    while(t--){
        cin>>n>>a>>b>>da>>db;
        adj = vector< vector<int> > (n+1);
        int u,v;
        for(int i=0;i<n-1;i++){
            cin>>u>>v;
            adj[u].epb(v);
            adj[v].epb(u);
        }
        d[b]=0;
        dfs(0,b);
        // fuck up at turn one;
        if ( d[a] <= da) {
            cout<<"Alice\n";
        }else{

            int first = -1;
            int second = -1;
            for(int v  : adj[b]){
                if (first == -1 || toLeaf[first]  <= toLeaf[v] ){
                    second = first ;
                    first = v;
                }else{
                    if ( second == - 1 || toLeaf[second] < toLeaf[v] ) second = v;
                }
            }
            ll maxl = 1;

            if(first != -1) maxl += toLeaf[first] ;
            if(second != -1) maxl += toLeaf[second];

            if ( min(diam-1,1LL*db) >= 1LL*da*2 + 1)
                cout<<"Bob\n";
            else
                cout<<"Alice\n";
        }
    }
}


// link here :
#include <bits/stdc++.h>
using namespace std;

#define NAME "do"
#define show(x) cout << (#x) << " is " << (x) << endl
#define ll long long
#define ms(arr,val) memset(arr,val,sizeof(arr))
#define len length()
#define pb push_back
#define epb emplace_back

const int maxn = 1e5+5;
int n,a,b,da,db;
vector< vector<int> > adj;
int d[maxn];
int toLeaf[maxn];
void dfs(int pre,int u){
    toLeaf[u] = 0 ;
    for(auto v : adj[u]){
        if (v == pre) continue;
        d[v] = d[u]+1;
        dfs(u,v);
        toLeaf[u]  = max( toLeaf[u] , toLeaf[v] );
    }
    toLeaf[u]++;
}
int main(){
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    //ifstream cin(NAME".inp");
    //ofstream cout(NAME".out");
    int t;
    cin>>t;
    while(t--){
        cin>>n>>a>>b>>da>>db;
        adj = vector< vector<int> > (n+1);
        int u,v;
        for(int i=0;i<n-1;i++){
            cin>>u>>v;
            adj[u].epb(v);
            adj[v].epb(u);
        }
        d[b]=0;
        dfs(0,b);
        // fuck up at turn one;
        if ( d[a] <= da) {
            cout<<"Alice\n";
        }else{

            int first = -1;
            int second = -1;
            for(int v  : adj[b]){
                if (first == -1 || toLeaf[first]  <= toLeaf[v] ){
                    second = first ;
                    first = v;
                }else{
                    if ( second == - 1 || toLeaf[second] < toLeaf[v] ) second = v;
                }
            }
            int maxl = 1;
            if(first != -1) maxl += toLeaf[first] ;
            if(second != -1) maxl += toLeaf[second];

            if ( maxl > 2*da + 1  && db >= 2*da + 1   )
                cout<<"Bob\n";
            else
                cout<<"Alice\n";
        }
    }
}


// link here :
#include <bits/stdc++.h>
using namespace std;

#define NAME "do"
#define show(x) cout << (#x) << " is " << (x) << endl
#define ll long long
#define ms(arr,val) memset(arr,val,sizeof(arr))
#define len length()
#define pb push_back
#define epb emplace_back

const int maxn = 1e5+5;
int n,a,b,da,db;
vector< vector<int> > adj;
int d[maxn];
int toLeaf[maxn];
int diam = 0;
void dfs(int pre,int u){

    toLeaf[u] = 0 ;
    for(auto v : adj[u]){
        if (v == pre) continue;
        d[v] = d[u]+1;
        dfs(u,v);
        toLeaf[u]  = max( toLeaf[u] , toLeaf[v] );
    }
    toLeaf[u]+=1;

    int first = -1;
    int second = -1;
    for(int v  : adj[u]){
        if (v == pre ) continue;
        if (first == -1 || toLeaf[first]  <= toLeaf[v] ){
            second = first ;
            first = v;
        }else{
            if ( second == - 1 || toLeaf[second] < toLeaf[v] ) second = v;
        }
    }

    int maxl = 1;
    if(first != -1) maxl += toLeaf[first] ;
    if(second != -1) maxl += toLeaf[second];
    diam = max(diam,maxl);

}
int main(){
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    //ifstream cin(NAME".inp");
    //ofstream cout(NAME".out");
    int t;
    cin>>t;
    while(t--){
        cin>>n>>a>>b>>da>>db;
        adj = vector< vector<int> > (n+1);
        int u,v;
        for(int i=0;i<n-1;i++){
            cin>>u>>v;
            adj[u].epb(v);
            adj[v].epb(u);
        }
        diam = 0;
        d[b]=0;
        ms(toLeaf,0);
        ms(d,0);
        dfs(0,b);
        // fuck up at turn one;
        if ( d[a] <= da) {
            cout<<"Alice\n";
        }else{
            if ( min(diam,db) > 2*da)
                cout<<"Bob\n";
            else
                cout<<"Alice\n";
        }
    }
}


// link here :
#include <bits/stdc++.h>
using namespace std;

#define NAME "do"
#define show(x) cout << (#x) << " is " << (x) << endl
#define ll long long
#define ms(arr,val) memset(arr,val,sizeof(arr))
#define len length()
#define pb push_back
#define epb emplace_back

const int maxn = 1e5+5;
int n,a,b,da,db;
vector< vector<int> > adj;
int d[maxn];
void dfs(int pre,int u){
    for(auto v : adj[u]){
        if (v==pre) continue;
        d[v] = d[u]+1;
        dfs(u,v);
    }
}
int main(){
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    //ifstream cin(NAME".inp");
    //ofstream cout(NAME".out");
    int t;
    cin>>t;
    while(t--){
        cin>>n>>a>>b>>da>>db;
        adj = vector< vector<int> > (n+1);
        int u,v;
        for(int i=0;i<n-1;i++){
            cin>>u>>v;
            adj[u].epb(v);
            adj[v].epb(u);
        }
        d[b]=0;
        dfs(0,b);
        // fuck up at turn one;
        if ( d[a] <= da) {
            cout<<"Alice\n";
        }else{
            int first = -1;
            int second = -1;
            for(int i=0;i<n;i++){
                if ( first == -1 || d[i] >= d[first] ){
                    second = first;
                    first = i;
                }else{
                    if (second == -1 || d[i] > d[second]) second = i;
                }
            }
            ll maxl = 0;
            if (first != -1) maxl = d[first];
            if (second != -1) maxl += d[second] + 1;

            if ( min(maxl-1,db) >= 1LL*da*2 + 1)
                cout<<"Bob\n";
            else
                cout<<"Alice\n";
        }
    }
}


// link here :
#include <bits/stdc++.h>
using namespace std;

#define NAME "do"
#define show(x) cout << (#x) << " is " << (x) << endl
#define ll long long
#define ms(arr,val) memset(arr,val,sizeof(arr))
#define len length()
#define pb push_back
#define epb emplace_back

const int maxn = 1e5+5;
int n,a,b,da,db;
vector< vector<int> > adj;
int d[maxn];
void dfs(int pre,int u){
    for(auto v : adj[u]){
        if (v==pre) continue;
        d[v] = d[u]+1;
        dfs(u,v);
    }
}
int main(){
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    //ifstream cin(NAME".inp");
    //ofstream cout(NAME".out");
    int t;
    cin>>t;
    while(t--){
        cin>>n>>a>>b>>da>>db;
        adj = vector< vector<int> > (n+1);
        int u,v;
        for(int i=0;i<n-1;i++){
            cin>>u>>v;
            adj[u].epb(v);
            adj[v].epb(u);
        }
        ms(d,0);
        dfs(0,b);
        // fuck up at turn one;
        if ( d[a] <= da) {
            cout<<"Alice\n";
        }else{
            int first = -1;
            int second = -1;
            for(int i=0;i<n;i++){
                if ( first == -1 || d[i] >= d[first] ){
                    second = first;
                    first = i;
                }else{
                    if (second == -1 || d[i] > d[second]) second = i;
                }
            }

            if (min(d[first] + d[second],db) >= da*2 + 1)
                cout<<"Bob\n";
            else
                cout<<"Alice\n";
        }
    }
}


// link here :
#include <bits/stdc++.h>
using namespace std;

#define NAME "do"
#define show(x) cout << (#x) << " is " << (x) << endl
#define ll long long
#define ms(arr,val) memset(arr,val,sizeof(arr))
#define len length()
#define pb push_back
#define epb emplace_back

const int maxn = 1e5+5;
int n,a,b,da,db;
vector< vector<int> > adj;
int d[maxn];
int toLeaf[maxn];
int diam = 0;
void dfs(int pre,int u){

    toLeaf[u] = 0 ;
    for(auto v : adj[u]){
        if (v == pre) continue;
        d[v] = d[u]+1;
        dfs(u,v);
        toLeaf[u]  = max( toLeaf[u] , toLeaf[v] );
    }
    toLeaf[u]+=1;

    int first = -1;
    int second = -1;
    for(int v  : adj[u]){
        if (v == pre ) continue;
        if (first == -1 || toLeaf[first]  <= toLeaf[v] ){
            second = first ;
            first = v;
        }else{
            if ( second == - 1 || toLeaf[second] < toLeaf[v] ) second = v;
        }
    }

    int maxl = 1;
    if(first != -1) maxl += toLeaf[first] ;
    if(second != -1) maxl += toLeaf[second];
    diam = max(diam,maxl);

}
int main(){
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    //ifstream cin(NAME".inp");
    //ofstream cout(NAME".out");
    int t;
    cin>>t;
    while(t--){
        cin>>n>>a>>b>>da>>db;
        adj = vector< vector<int> > (n+1);
        int u,v;
        for(int i=0;i<n-1;i++){
            cin>>u>>v;
            adj[u].epb(v);
            adj[v].epb(u);
        }
        diam = 0;
        d[b]=0;
        dfs(0,b);
        // fuck up at turn one;
        if ( d[a] <= da) {
            cout<<"Alice\n";
        }else{
            if ( db >= 2*da + 1 && diam > 2*da + 1 )
                cout<<"Bob\n";
            else
                cout<<"Alice\n";
        }
    }
}


// link here :
#include <bits/stdc++.h>
using namespace std;

#define NAME "do"
#define show(x) cout << (#x) << " is " << (x) << endl
#define ll long long
#define ms(arr,val) memset(arr,val,sizeof(arr))
#define len length()
#define pb push_back
#define epb emplace_back

const int maxn = 1e5+5;
int n,a,b,da,db;
vector< vector<int> > adj;
int d[maxn];
ll toLeaf[maxn];
void dfs(int pre,int u){

    for(auto v : adj[u]){
        if (v == pre) continue;
        d[v] = d[u]+1;
        dfs(u,v);
    }
    toLeaf[u]=0;
    if(adj[u].size()!=1 || u == b){
        for(auto v : adj[u]){
            if (v == pre )continue;
            toLeaf[u]  = max( toLeaf[u] , toLeaf[v] );
        }
    }
    toLeaf[u]+=1;

}
int main(){
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    ///ifstream cin(NAME".inp");
    //ofstream cout(NAME".out");
    int t;
    cin>>t;
    while(t--){
        cin>>n>>a>>b>>da>>db;
        adj = vector< vector<int> > (n+1);
        int u,v;
        for(int i=0;i<n-1;i++){
            cin>>u>>v;
            adj[u].epb(v);
            adj[v].epb(u);
        }
        d[b]=0;
        dfs(0,b);
        // fuck up at turn one;
        if ( d[a] <= da) {
            cout<<"Alice\n";
        }else{

            ll maxl = 0;
            int first = -1;
            int second = -1;
            for(int v  : adj[b]){
                if (first == -1 || toLeaf[first]  <= toLeaf[v] ){
                    second = first ;
                    first = v;
                }else{
                    if ( second == - 1 || toLeaf[second] < toLeaf[v] ) second = v;
                }
            }
            if(first != -1) maxl = toLeaf[first] + 1;
            if(second != -1) maxl = toLeaf[second];

            if ( min(maxl,1LL*db) >= 1LL*da*2 + 1)
                cout<<"Bob\n";
            else
                cout<<"Alice\n";
        }
    }
}


// link here :
#include <bits/stdc++.h>
using namespace std;

#define NAME "do"
#define show(x) cout << (#x) << " is " << (x) << endl
#define ll long long
#define ms(arr,val) memset(arr,val,sizeof(arr))
#define len length()
#define pb push_back
#define epb emplace_back

const int maxn = 1e5+5;
int n,a,b,da,db;
vector< vector<int> > adj;
int d[maxn];
void dfs(int pre,int u){
    for(auto v : adj[u]){
        if (v==pre) continue;
        d[v] = d[u]+1;
        dfs(u,v);
    }
}
int main(){
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    //ifstream cin(NAME".inp");
    //ofstream cout(NAME".out");
    int t;
    cin>>t;
    while(t--){
        cin>>n>>a>>b>>da>>db;
        adj = vector< vector<int> > (n+1);
        int u,v;
        for(int i=0;i<n-1;i++){
            cin>>u>>v;
            adj[u].epb(v);
            adj[v].epb(u);
        }
        d[b]=0;
        dfs(0,b);
        // fuck up at turn one;
        if ( d[a] <= da) {
            cout<<"Alice\n";
        }else{
            int first = -1;
            int second = -1;
            for(int i=0;i<n;i++){
                if ( first == -1 || d[i] >= d[first] ){
                    second = first;
                    first = i;
                }else{
                    if (second == -1 || d[i] > d[second]) second = i;
                }
            }
            int maxl;
            if (first != -1) maxl = d[first];
            if (second != -1) maxl += d[second];

            if ( min(maxl + 1,db) >= da*2 + 1)
                cout<<"Bob\n";
            else
                cout<<"Alice\n";
        }
    }
}


// link here :
#include <bits/stdc++.h>
using namespace std;

#define NAME "do"
#define show(x) cout << (#x) << " is " << (x) << endl
#define ll long long
#define ms(arr,val) memset(arr,val,sizeof(arr))
#define len length()
#define pb push_back
#define epb emplace_back

const int maxn = 1e5+5;
int n,a,b,da,db;
vector< vector<int> > adj;
int d[maxn];
ll toLeaf[maxn];
void dfs(int pre,int u){

    for(auto v : adj[u]){
        if (v == pre) continue;
        d[v] = d[u]+1;
        dfs(u,v);
    }
    toLeaf[u]=0;
    if(adj[u].size()!=1 || u == b){
        for(auto v : adj[u]){
            if (v == pre )continue;
            toLeaf[u]  = max( toLeaf[u] , toLeaf[v] );
        }
    }
    toLeaf[u]+=1;

}
int main(){
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    //ifstream cin(NAME".inp");
    //ofstream cout(NAME".out");
    int t;
    cin>>t;
    while(t--){
        cin>>n>>a>>b>>da>>db;
        adj = vector< vector<int> > (n+1);
        int u,v;
        for(int i=0;i<n-1;i++){
            cin>>u>>v;
            adj[u].epb(v);
            adj[v].epb(u);
        }
        d[b]=0;
        dfs(0,b);
        // fuck up at turn one;
        if ( d[a] <= da) {
            cout<<"Alice\n";
        }else{

            int first = -1;
            int second = -1;
            for(int v  : adj[b]){
                if (first == -1 || toLeaf[first]  <= toLeaf[v] ){
                    second = first ;
                    first = v;
                }else{
                    if ( second == - 1 || toLeaf[second] < toLeaf[v] ) second = v;
                }
            }
            ll maxl = 1;

            if(first != -1) maxl += toLeaf[first] ;
            if(second != -1) maxl += toLeaf[second];

            if ( min(maxl -1,1LL*db) >= 1LL*da*2 + 1)
                cout<<"Bob\n";
            else
                cout<<"Alice\n";
        }
    }
}


// link here :
#include <bits/stdc++.h>
using namespace std;

#define NAME "do"
#define show(x) cout << (#x) << " is " << (x) << endl
#define ll long long
#define ms(arr,val) memset(arr,val,sizeof(arr))
#define len length()
#define pb push_back
#define epb emplace_back

const int maxn = 1e5+5;
int n,a,b,da,db;
vector< vector<int> > adj;
int d[maxn];
ll toLeaf[maxn];
ll diam = 0;
void dfs(int pre,int u){

    for(auto v : adj[u]){
        if (v == pre) continue;
        d[v] = d[u]+1;
        dfs(u,v);
    }
    toLeaf[u]=0;

    if(adj[u].size()!=1 || u == b){
        for(auto v : adj[u]){
            if (v == pre )continue;
            toLeaf[u]  = max( toLeaf[u] , toLeaf[v] );
        }
    }
    toLeaf[u]+=1;

    int first = -1;
    int second = -1;
    for(int v  : adj[u]){
        if (v == pre ) continue;
        if (first == -1 || toLeaf[first]  <= toLeaf[v] ){
            second = first ;
            first = v;
        }else{
            if ( second == - 1 || toLeaf[second] < toLeaf[v] ) second = v;
        }
    }

    ll maxl = 1;

    if(first != -1) maxl += toLeaf[first] ;
    if(second != -1) maxl += toLeaf[second];

    diam = max(diam,maxl);

}
int main(){
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    //ifstream cin(NAME".inp");
    //ofstream cout(NAME".out");
    int t;
    cin>>t;
    while(t--){
        cin>>n>>a>>b>>da>>db;
        adj = vector< vector<int> > (n+1);
        int u,v;
        for(int i=0;i<n-1;i++){
            cin>>u>>v;
            adj[u].epb(v);
            adj[v].epb(u);
        }
        diam = 0;
        d[b]=0;
        dfs(0,b);
        // fuck up at turn one;
        if ( d[a] <= da) {
            cout<<"Alice\n";
        }else{
            if ( min(diam,1LL*db) > 2*da)
                cout<<"Bob\n";
            else
                cout<<"Alice\n";
        }
    }
}


// link here :
#include <bits/stdc++.h>
using namespace std;

#define NAME "do"
#define show(x) cout << (#x) << " is " << (x) << endl
#define ll long long
#define ms(arr,val) memset(arr,val,sizeof(arr))
#define len length()
#define pb push_back
#define epb emplace_back

const int maxn = 1e5+5;
int n,a,b,da,db;
vector< vector<int> > adj;
int d[maxn];
int toLeaf[maxn];
int diam = 0;
void dfs(int pre,int u){

    toLeaf[u] = 0 ;
    for(auto v : adj[u]){
        if (v == pre) continue;
        d[v] = d[u]+1;
        dfs(u,v);
        toLeaf[u]  = max( toLeaf[u] , toLeaf[v] );
    }
    toLeaf[u]+=1;

    int first = -1;
    int second = -1;
    for(int v  : adj[u]){
        if (v == pre ) continue;
        if (first == -1 || toLeaf[first]  <= toLeaf[v] ){
            second = first ;
            first = v;
        }else{
            if ( second == - 1 || toLeaf[second] < toLeaf[v] ) second = v;
        }
    }

    int maxl = 0;
    if(first != -1) maxl += toLeaf[first] ;
    if(second != -1) maxl += toLeaf[second];
    diam = max(diam,maxl);

}
int main(){
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
   //ifstream cin(NAME".inp");
    //ofstream cout(NAME".out");
    int t;
    cin>>t;
    while(t--){
        cin>>n>>a>>b>>da>>db;
        adj = vector< vector<int> > (n+1);
        int u,v;
        for(int i=0;i<n-1;i++){
            cin>>u>>v;
            adj[u].epb(v);
            adj[v].epb(u);
        }
        diam = 0;
        d[b]=0;
        dfs(0,b);
        // fuck up at turn one;
        if ( d[a] <= da) {
            cout<<"Alice\n";
        }else{
            if ( 2*da < min(diam,db) )
                cout<<"Bob\n";
            else
                cout<<"Alice\n";
        }
    }
}


// link here :
#include <bits/stdc++.h>
using namespace std;

#define NAME "do"
#define show(x) cout << (#x) << " is " << (x) << endl
#define ll long long
#define ms(arr,val) memset(arr,val,sizeof(arr))
#define len length()
#define pb push_back
#define epb emplace_back

const int maxn = 1e5+5;
int n,a,b,da,db;
vector< vector<int> > adj;
int d[maxn];
ll toLeaf[maxn];
void dfs(int pre,int u){
    for(auto v : adj[u]){
        if (v==pre) continue;
        d[v] = d[u]+1;
        dfs(u,v);
    }

    int first = -1;
    int second = -1;
    for( auto v : adj[u] ){
        if ( first == -1 || d[v] >= d[first] ){
            second = first;
            first = v;
        }else{
            if (second == -1 || d[v] > d[second]) second = v;
        }
    }
    toLeaf[u] = 0;
    if(first != -1) toLeaf[u] = d[first];
    if(second != -1) toLeaf[u] += d[second];
    if (toLeaf[u]!=0) toLeaf[u]++;
}
int main(){
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    //ifstream cin(NAME".inp");
    //ofstream cout(NAME".out");
    int t;
    cin>>t;
    while(t--){
        cin>>n>>a>>b>>da>>db;
        adj = vector< vector<int> > (n+1);
        int u,v;
        for(int i=0;i<n-1;i++){
            cin>>u>>v;
            adj[u].epb(v);
            adj[v].epb(u);
        }
        d[b]=0;
        dfs(0,b);
        // fuck up at turn one;
        if ( d[a] <= da) {
            cout<<"Alice\n";
        }else{
            if ( min(toLeaf[u]-1,1LL*db) >= 1LL*da*2 + 1)
                cout<<"Bob\n";
            else
                cout<<"Alice\n";
        }
    }
}


// link here :
#include <bits/stdc++.h>
using namespace std;

#define NAME "do"
#define show(x) cout << (#x) << " is " << (x) << endl
#define ll long long
#define ms(arr,val) memset(arr,val,sizeof(arr))
#define len length()
#define pb push_back
#define epb emplace_back

const int maxn = 1e5+5;
int n,a,b,da,db;
vector< vector<int> > adj;
int d[maxn];
ll toLeaf[maxn];
ll diam = 0;
void dfs(int pre,int u){

    for(auto v : adj[u]){
        if (v == pre) continue;
        d[v] = d[u]+1;
        dfs(u,v);
    }
    toLeaf[u]=0;

    if(adj[u].size()!=1 || u == b){
        for(auto v : adj[u]){
            if (v == pre )continue;
            toLeaf[u]  = max( toLeaf[u] , toLeaf[v] );
        }
    }
    toLeaf[u]+=1;

    int first = -1;
    int second = -1;
    for(int v  : adj[u]){
        if (v == pre ) continue;
        if (first == -1 || toLeaf[first]  <= toLeaf[v] ){
            second = first ;
            first = v;
        }else{
            if ( second == - 1 || toLeaf[second] < toLeaf[v] ) second = v;
        }
    }

    ll maxl = 1;

    if(first != -1) maxl += toLeaf[first] ;
    if(second != -1) maxl += toLeaf[second];

    diam = max(diam,maxl);

}
int main(){
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    //ifstream cin(NAME".inp");
    //ofstream cout(NAME".out");
    int t;
    cin>>t;
    while(t--){
        cin>>n>>a>>b>>da>>db;
        adj = vector< vector<int> > (n+1);
        int u,v;
        for(int i=0;i<n-1;i++){
            cin>>u>>v;
            adj[u].epb(v);
            adj[v].epb(u);
        }
        d[b]=0;
        dfs(0,b);
        // fuck up at turn one;
        if ( d[a] <= da) {
            cout<<"Alice\n";
        }else{
            if ( min(diam,1LL*db) > 2*da)
                cout<<"Bob\n";
            else
                cout<<"Alice\n";
        }
    }
}


// link here :
#include <bits/stdc++.h>
using namespace std;

#define NAME "do"
#define show(x) cout << (#x) << " is " << (x) << endl
#define ll long long
#define ms(arr,val) memset(arr,val,sizeof(arr))
#define len length()
#define pb push_back
#define epb emplace_back

const int maxn = 1e5+5;
int n,a,b,da,db;
vector< vector<int> > adj;
int d[maxn];
void dfs(int pre,int u){
    for(auto v : adj[u]){
        if (v==pre) continue;
        d[v] = d[u]+1;
        dfs(u,v);
    }
}
int main(){
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    //ifstream cin(NAME".inp");
    //ofstream cout(NAME".out");
    int t;
    cin>>t;
    while(t--){
        cin>>n>>a>>b>>da>>db;
        adj = vector< vector<int> > (n+1);
        int u,v;
        for(int i=0;i<n-1;i++){
            cin>>u>>v;
            adj[u].epb(v);
            adj[v].epb(u);
        }
        d[b]=0;
        dfs(0,b);
        // fuck up at turn one;
        if ( d[a] <= da) {
            cout<<"Alice\n";
        }else{
            int first = -1;
            int second = -1;
            for(int i=0;i<n;i++){
                if ( first == -1 || d[i] >= d[first] ){
                    second = first;
                    first = i;
                }else{
                    if (second == -1 || d[i] > d[second]) second = i;
                }
            }
            ll maxl = 0;
            if (first != -1) maxl = d[first];
            if (second != -1) maxl += d[second] + 1;

            if ( min(maxl-1,1LL*db) >= 1LL*da*2 + 1)
                cout<<"Bob\n";
            else
                cout<<"Alice\n";
        }
    }
}


// link here :
#include <bits/stdc++.h>
using namespace std;

#define NAME "do"
#define show(x) cout << (#x) << " is " << (x) << endl
#define ll long long
#define ms(arr,val) memset(arr,val,sizeof(arr))
#define len length()
#define pb push_back
#define epb emplace_back

const int maxn = 1e5+5;
int n,a,b,da,db;
vector< vector<int> > adj;
int d[maxn];
ll toLeaf[maxn];
ll diam = 0;
void dfs(int pre,int u){

    for(auto v : adj[u]){
        if (v == pre) continue;
        d[v] = d[u]+1;
        dfs(u,v);
    }
    toLeaf[u]=0;
    if(adj[u].size()!=1 || u == b){
        for(auto v : adj[u]){
            if (v == pre )continue;
            toLeaf[u]  = max( toLeaf[u] , toLeaf[v] );
        }
    }
    toLeaf[u]+=1;

    int first = -1;
    int second = -1;
    for(int v  : adj[u]){
        if (first == -1 || toLeaf[first]  <= toLeaf[v] ){
            second = first ;
            first = v;
        }else{
            if ( second == - 1 || toLeaf[second] < toLeaf[v] ) second = v;
        }
    }
    ll maxl = 1;

    if(first != -1) maxl += toLeaf[first] ;
    if(second != -1) maxl += toLeaf[second];

    diam = max(diam,maxl);

}
int main(){
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    //ifstream cin(NAME".inp");
    //ofstream cout(NAME".out");
    int t;
    cin>>t;
    while(t--){
        cin>>n>>a>>b>>da>>db;
        adj = vector< vector<int> > (n+1);
        int u,v;
        for(int i=0;i<n-1;i++){
            cin>>u>>v;
            adj[u].epb(v);
            adj[v].epb(u);
        }
        d[b]=0;
        dfs(0,b);
        // fuck up at turn one;
        if ( d[a] <= da) {
            cout<<"Alice\n";
        }else{
            if ( min(diam,1LL*db) > 2*da)
                cout<<"Bob\n";
            else
                cout<<"Alice\n";
        }
    }
}


// link here :
#include <bits/stdc++.h>
using namespace std;

#define NAME "do"
#define show(x) cout << (#x) << " is " << (x) << endl
#define ll long long
#define ms(arr,val) memset(arr,val,sizeof(arr))
#define len length()
#define pb push_back
#define epb emplace_back

const int maxn = 1e5+5;
int n,a,b,da,db;
vector< vector<int> > adj;
int d[maxn];
void dfs(int pre,int u){
    for(auto v : adj[u]){
        if (v==pre) continue;
        d[v] = d[u]+1;
        dfs(u,v);
    }
}
int main(){
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    //ifstream cin(NAME".inp");
    //ofstream cout(NAME".out");
    int t;
    cin>>t;
    while(t--){
        cin>>n>>a>>b>>da>>db;
        adj = vector< vector<int> > (n+1);
        int u,v;
        for(int i=0;i<n-1;i++){
            cin>>u>>v;
            adj[u].epb(v);
            adj[v].epb(u);
        }
        d[b]=0;
        dfs(0,b);
        // fuck up at turn one;
        if ( d[a] <= da) {
            cout<<"Alice\n";
        }else{
            int first = -1;
            int second = -1;
            for(int i=0;i<n;i++){
                if ( first == -1 || d[i] >= d[first] ){
                    second = first;
                    first = i;
                }else{
                    if (second == -1 || d[i] > d[second]) second = i;
                }
            }
            int maxl;
            if (first != -1) maxl = d[first];
            if (second != -1) maxl += d[second] + 1;

            if ( min(maxl-1,db) >= da*2 + 1)
                cout<<"Bob\n";
            else
                cout<<"Alice\n";
        }
    }
}


// link here :
#include <bits/stdc++.h>
using namespace std;

#define NAME "do"
#define show(x) cout << (#x) << " is " << (x) << endl
#define ll long long
#define ms(arr,val) memset(arr,val,sizeof(arr))
#define len length()
#define pb push_back
#define epb emplace_back

const int maxn = 1e5+5;
int n,a,b,da,db;
vector< vector<int> > adj;
int d[maxn];
void dfs(int pre,int u){
    for(auto v : adj[u]){
        if (v==pre) continue;
        d[v] = d[u]+1;
        dfs(u,v);
    }
}
int main(){
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    //ifstream cin(NAME".inp");
    //ofstream cout(NAME".out");
    int t;
    cin>>t;
    while(t--){
        cin>>n>>a>>b>>da>>db;
        adj = vector< vector<int> > (n+1);
        int u,v;
        for(int i=0;i<n-1;i++){
            cin>>u>>v;
            adj[u].epb(v);
            adj[v].epb(u);
        }
        d[b]=0;
        dfs(0,b);
        // fuck up at turn one;
        if ( d[a] <= da) {
            cout<<"Alice\n";
        }else{
            int first = -1;
            int second = -1;
            for(int i=0;i<n;i++){
                if ( first == -1 || d[i] >= d[first] ){
                    second = first;
                    first = i;
                }else{
                    if (second == -1 || d[i] > d[second]) second = i;
                }
            }
            int maxl = 0;
            if (first != -1) maxl = d[first];
            if (second != -1) maxl += d[second] + 1;

            if ( min(maxl-1,db) >= 1LL*da*2 + 1)
                cout<<"Bob\n";
            else
                cout<<"Alice\n";
        }
    }
}


#include<bits/stdc++.h>
using namespace std;
#define sz(a) ((int)a.size())
#define rep(i,a,b) for(ll i = (a);i < (b);(i)++)
#define per(i,a,b) for(ll i = (b-1);i >= (a);(i)--)
const int maxn = 1e6+10;
typedef long long ll;

int n,a,b,da,db,c;
vector<int>G[maxn];
int dis[maxn][2],mx[maxn],t[maxn];

bool is;

void dfs0(int u,int fa)
{
	bool f = 0;
	dis[u][0] = dis[u][1] = 0;
	for(int v:G[u])
	{
		if(v==fa) continue;
		f = 1;
		dfs0(v,u);
		if(dis[v][0]+1>=dis[u][0])
		{
			dis[u][1] = dis[u][0];
			dis[u][0] = dis[v][0]+1;
		}
		else
		{
			dis[u][1] = max(dis[u][1],dis[v][0]+1);
		}
	}
}

void dfs1(int u,int fa)
{
	bool f = 0;
	if(u==fa)
	{
		mx[u] = dis[u][0];
	}
	else
	{
		if(dis[u][0]+1==dis[fa][0])
		{
			if(dis[fa][1]+1>=dis[u][0])
			{
				dis[u][1] = dis[u][0];
				dis[u][0] = dis[fa][1]+1;
			}
			else
			{
				dis[u][1] = max(dis[u][1],dis[fa][1]+1);
			}
		}
		else
		{
			if(dis[fa][0]+1>=dis[u][0])
			{
				dis[u][1] = dis[u][0];
				dis[u][0] = dis[fa][0]+1;
			}
			else
			{
				dis[u][1] = max(dis[u][1],dis[fa][0]+1);
			}
		}
	}

	//cout<<u<<' '<<mx[u]<<' '<<dis[u][0]<<' '<<dis[u][1]<<endl;

	for(int v:G[u])
	{
		if(v==fa) continue;
		dfs1(v,u);
	}
}

void dfs2(int u,int fa,int d)
{
	t[u] = (d+da-1)/da;
	for(int v:G[u])
	{
		if(v==fa) continue;
		dfs2(v,u,d+1);
	}
}

void dfs3(int u,int fa,int d)
{
	if(!is) return ;
	int tt = (d+da-1)/da;

//	cout<<tt<<' '<<t[u]<<endl;
//	cout<<u<<' '<<mx[u]<<' '<<dis[u][0]<<' '<<dis[u][1]<<endl;

	if(tt+1<t[u]&&dis[u][0]>=2*da+1&&db>=2*da+1) is = 0;
	for(int v:G[u])
	{
		if(v==fa) continue;
		dfs3(v,u,d+1);
	}
}

int main()
{
	int T;
	cin>>T;
	while(T--)
	{
		is = 1;

		cin>>n>>a>>b>>da>>db;
		rep(i,1,n+1) G[i].clear();

		rep(i,0,n-1)
		{
			int x,y;
			cin>>x>>y;
			G[x].push_back(y);
			G[y].push_back(x);
		}

		int r = 1;
		rep(i,1,n+1)
		{
			if(sz(G[i])==1)
			{
				r = i;
				break;
			}
		}

		dfs0(r,r);
		dfs1(r,r);

		dfs2(a,a,0);
		dfs3(b,b,0);

		//if(t[b]<=1) is = 1;

		cout<<(is?"Alice":"Bob")<<endl;
	}
}
/*
??111??
*/


#include<bits/stdc++.h>
using namespace std;
#define sz(a) ((int)a.size())
#define rep(i,a,b) for(ll i = (a);i < (b);(i)++)
#define per(i,a,b) for(ll i = (b-1);i >= (a);(i)--)
const int maxn = 1e6+10;
typedef long long ll;

int n,a,b,da,db,c;
vector<int>G[maxn];
int dis[maxn][2],mx[maxn],t[maxn];

bool is;

void dfs0(int u,int fa)
{
	bool f = 0;
	dis[u][0] = dis[u][1] = 0;
	for(int v:G[u])
	{
		if(v==fa) continue;
		f = 1;
		dfs0(v,u);
		if(dis[v][0]+1>=dis[u][0])
		{
			dis[u][1] = dis[u][0];
			dis[u][0] = dis[v][0]+1;
		}
		else
		{
			dis[u][1] = max(dis[u][1],dis[v][0]+1);
		}
	}
}

void dfs1(int u,int fa)
{
	bool f = 0;
	if(u==fa)
	{
		mx[u] = dis[u][0];
	}
	else
	{
		if(dis[u][0]+1==dis[fa][0])
		{
			if(dis[fa][1]+1>=dis[u][0])
			{
				dis[u][1] = dis[u][0];
				dis[u][0] = dis[fa][1]+1;
			}
			else
			{
				dis[u][1] = max(dis[u][1],dis[fa][1]+1);
			}
		}
		else
		{
			if(dis[fa][0]+1>=dis[u][0])
			{
				dis[u][1] = dis[u][0];
				dis[u][0] = dis[fa][0]+1;
			}
			else
			{
				dis[u][1] = max(dis[u][1],dis[fa][0]+1);
			}
		}
	}

	//cout<<u<<' '<<mx[u]<<' '<<dis[u][0]<<' '<<dis[u][1]<<endl;

	for(int v:G[u])
	{
		if(v==fa) continue;
		dfs1(v,u);
	}
}

void dfs2(int u,int fa,int d)
{
	t[u] = (d+da-1)/da;
	for(int v:G[u])
	{
		if(v==fa) continue;
		dfs2(v,u,d+1);
	}
}

void dfs3(int u,int fa,int d)
{
	if(!is) return ;
	int tt = (d+db-1)/db;

//	cout<<tt<<' '<<t[u]<<endl;
//	cout<<u<<' '<<mx[u]<<' '<<dis[u][0]<<' '<<dis[u][1]<<endl;

	if(tt+2<=t[u]&&dis[u][0]>=2*da+1&&db>=2*da+1) is = 0;
	for(int v:G[u])
	{
		if(v==fa) continue;
		dfs3(v,u,d+1);
	}
}

int main()
{
	int T;
	cin>>T;
	while(T--)
	{
		is = 1;

		cin>>n>>a>>b>>da>>db;
		rep(i,1,n+1) G[i].clear();

		rep(i,0,n-1)
		{
			int x,y;
			cin>>x>>y;
			G[x].push_back(y);
			G[y].push_back(x);
		}

		int r = 1;
		rep(i,1,n+1)
		{
			if(sz(G[i])==1)
			{
				r = i;
				break;
			}
		}

		dfs0(r,r);
		dfs1(r,r);

		dfs2(a,a,0);
		dfs3(b,b,0);

		//if(t[b]<=1) is = 1;

		cout<<(is?"Alice":"Bob")<<endl;
	}
}
/*
??111??
*/


#include<bits/stdc++.h>
using namespace std;
#define sz(a) ((int)a.size())
#define rep(i,a,b) for(ll i = (a);i < (b);(i)++)
#define per(i,a,b) for(ll i = (b-1);i >= (a);(i)--)
const int maxn = 1e6+10;
typedef long long ll;

int n,a,b,da,db,c;
vector<int>G[maxn];
int dis[maxn][2],mx[maxn],t[maxn];

bool is;

void dfs0(int u,int fa)
{
	bool f = 0;
	dis[u][0] = dis[u][1] = 0;
	for(int v:G[u])
	{
		if(v==fa) continue;
		f = 1;
		dfs0(v,u);
		if(dis[v][0]+1>=dis[u][0])
		{
			dis[u][1] = dis[u][0];
			dis[u][0] = dis[v][0]+1;
		}
		else
		{
			dis[u][1] = max(dis[u][1],dis[v][0]+1);
		}
	}
}

void dfs1(int u,int fa)
{
	bool f = 0;
	if(u==fa)
	{
		mx[u] = dis[u][0];
	}
	else
	{
		if(dis[u][0]+1==dis[fa][0])
		{
			if(dis[fa][1]+1>=dis[u][0])
			{
				dis[u][1] = dis[u][0];
				dis[u][0] = dis[fa][1]+1;
			}
			else
			{
				dis[u][1] = max(dis[u][1],dis[fa][1]+1);
			}
		}
		else
		{
			if(dis[fa][0]+1>=dis[u][0])
			{
				dis[u][1] = dis[u][0];
				dis[u][0] = dis[fa][0]+1;
			}
			else
			{
				dis[u][1] = max(dis[u][1],dis[fa][0]+1);
			}
		}
	}

	//cout<<u<<' '<<mx[u]<<' '<<dis[u][0]<<' '<<dis[u][1]<<endl;

	for(int v:G[u])
	{
		if(v==fa) continue;
		dfs1(v,u);
	}
}

void dfs2(int u,int fa,int d)
{
	t[u] = (d+da-1)/da;
	for(int v:G[u])
	{
		if(v==fa) continue;
		dfs2(v,u,d+1);
	}
}

void dfs3(int u,int fa,int d)
{
	if(!is) return ;
	int tt = (d+db-1)/db;

//	cout<<tt<<' '<<t[u]<<endl;
//	cout<<u<<' '<<mx[u]<<' '<<dis[u][0]<<' '<<dis[u][1]<<endl;

	if(tt+1<t[u]&&dis[u][0]>=2*da+1&&db>=2*da+1) is = 0;
	for(int v:G[u])
	{
		if(v==fa) continue;
		dfs3(v,u,d+1);
	}
}

int main()
{
	int T;
	cin>>T;
	while(T--)
	{
		is = 1;

		cin>>n>>a>>b>>da>>db;
		rep(i,1,n+1) G[i].clear();

		rep(i,0,n-1)
		{
			int x,y;
			cin>>x>>y;
			G[x].push_back(y);
			G[y].push_back(x);
		}

		int r = 1;
		rep(i,1,n+1)
		{
			if(sz(G[i])==1)
			{
				r = i;
				break;
			}
		}

		dfs0(r,r);
		dfs1(r,r);

		dfs2(a,a,0);
		dfs3(b,b,0);

		//if(t[b]<=1) is = 1;

		cout<<(is?"Alice":"Bob")<<endl;
	}
}
/*
??111??
*/


#include<bits/stdc++.h>
using namespace std;
#define sz(a) ((int)a.size())
#define rep(i,a,b) for(ll i = (a);i < (b);(i)++)
#define per(i,a,b) for(ll i = (b-1);i >= (a);(i)--)
const int maxn = 1e6+10;
typedef long long ll;

int n,a,b,da,db,d;
vector<int>G[maxn];
int dp[maxn][2],dis[maxn];

bool is;

void dfs(int u,int fa)
{
    dp[u][0] = dp[u][1] = 0;
    for(int v:G[u])
    {
        if(v==fa) continue;

        dis[v] = dis[u]+1;
        dfs(v,u);

        if(dp[v][0]+1>=dp[u][0])
        {
            dp[u][1] = dp[u][0];
            dp[u][0] = dp[v][0]+1;
        }
        else if(dp[v][0]+1>dp[u][1])
        {
            dp[u][1] = max(dp[u][1],dp[v][0]+1);
        }
    }

    d = max(d,dp[u][0]+dp[u][1]);
}

int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        cin>>n>>a>>b>>da>>db;
        rep(i,1,n+1) G[i].clear();

        rep(i,0,n-1)
        {
            int x,y;
            cin>>x>>y;
            G[x].push_back(y);
            G[y].push_back(x);
        }

        is = 1;
        d = dis[a] = 0;

        dfs(a,a);

        if(dis[b]>da&&d>da*2&&db>da*2) is = 0;

        cout<<(is?"Alice":"Bob")<<endl;
    }
}
/*
1
4 2 4 1 3
1 2
2 3
3 4

1
6 2 5 2 5
1 2
2 3
3 4
4 5
5 6
*/


#include<bits/stdc++.h>
using namespace std;
#define sz(a) ((int)a.size())
#define rep(i,a,b) for(ll i = (a);i < (b);(i)++)
#define per(i,a,b) for(ll i = (b-1);i >= (a);(i)--)
const int maxn = 1e6+10;
typedef long long ll;

int n,a,b,da,db,c;
vector<int>G[maxn];
int dis[maxn][2],mx[maxn],t[maxn];

bool is;

void dfs0(int u,int fa)
{
	bool f = 0;
	dis[u][0] = dis[u][1] = 0;
	for(int v:G[u])
	{
		if(v==fa) continue;
		f = 1;
		dfs0(v,u);
		if(dis[v][0]+1>=dis[u][0])
		{
			dis[u][1] = dis[u][0];
			dis[u][0] = dis[v][0]+1;
		}
		else
		{
			dis[u][1] = max(dis[u][1],dis[v][0]+1);
		}
	}
}

void dfs1(int u,int fa)
{
	bool f = 0;
	if(u==fa)
	{
		mx[u] = dis[u][0];
	}
	else
	{
		if(dis[u][0]+1==dis[fa][0])
		{
			if(dis[fa][1]+1>=dis[u][0])
			{
				dis[u][1] = dis[u][0];
				dis[u][0] = dis[fa][1]+1;
			}
			else
			{
				dis[u][1] = max(dis[u][1],dis[fa][1]+1);
			}
		}
		else
		{
			if(dis[fa][0]+1>=dis[u][0])
			{
				dis[u][1] = dis[u][0];
				dis[u][0] = dis[fa][0]+1;
			}
			else
			{
				dis[u][1] = max(dis[u][1],dis[fa][0]+1);
			}
		}
	}

	//cout<<u<<' '<<mx[u]<<' '<<dis[u][0]<<' '<<dis[u][1]<<endl;

	for(int v:G[u])
	{
		if(v==fa) continue;
		dfs1(v,u);
	}
}

void dfs2(int u,int fa,int d)
{
	t[u] = (d+da-1)/da;
	for(int v:G[u])
	{
		if(v==fa) continue;
		dfs2(v,u,d+1);
	}
}

void dfs3(int u,int fa,int d)
{
	if(!is) return ;
	int tt = (d+db-1)/db;

//	cout<<tt<<' '<<t[u]<<endl;
//	cout<<u<<' '<<mx[u]<<' '<<dis[u][0]<<' '<<dis[u][1]<<endl;

	if(dis[u][0]>=2*da+1&&db>=2*da+1) is = 0;
	for(int v:G[u])
	{
		if(v==fa) continue;
		dfs3(v,u,d+1);
	}
}

int main()
{
	int T;
	cin>>T;
	while(T--)
	{
		is = 1;

		cin>>n>>a>>b>>da>>db;
		rep(i,1,n+1) G[i].clear();

		rep(i,0,n-1)
		{
			int x,y;
			cin>>x>>y;
			G[x].push_back(y);
			G[y].push_back(x);
		}

		int r = 1;
		rep(i,1,n+1)
		{
			if(sz(G[i])==1)
			{
				r = i;
				break;
			}
		}

		dfs0(r,r);
		dfs1(r,r);

		dfs2(a,a,0);
		dfs3(b,b,0);

		//if(t[b]<=1) is = 1;

		cout<<(is?"Alice":"Bob")<<endl;
	}
}
/*
1
4 2 4 1 3
1 2
2 3
3 4
*/


#include<bits/stdc++.h>
using namespace std;
#define sz(a) ((int)a.size())
#define rep(i,a,b) for(ll i = (a);i < (b);(i)++)
#define per(i,a,b) for(ll i = (b-1);i >= (a);(i)--)
const int maxn = 1e6+10;
typedef long long ll;

int n,a,b,da,db,c;
vector<int>G[maxn];
int dis[maxn][2],mx[maxn],t[maxn];

bool is;
int mmx;

void dfs0(int u,int fa)
{
    bool f = 0;
    dis[u][0] = dis[u][1] = 0;
    for(int v:G[u])
    {
        if(v==fa) continue;
        f = 1;
        dfs0(v,u);
        if(dis[v][0]+1>=dis[u][0])
        {
            dis[u][1] = dis[u][0];
            dis[u][0] = dis[v][0]+1;
        }
        else
        {
            dis[u][1] = max(dis[u][1],dis[v][0]+1);
        }
    }
}

void dfs1(int u,int fa)
{
    bool f = 0;
    if(u==fa)
    {
        mx[u] = dis[u][0];
    }
    else
    {
        if(dis[u][0]+1==dis[fa][0])
        {
            if(dis[fa][1]+1>=dis[u][0])
            {
                dis[u][1] = dis[u][0];
                dis[u][0] = dis[fa][1]+1;
            }
            else
            {
                dis[u][1] = max(dis[u][1],dis[fa][1]+1);
            }
        }
        else
        {
            if(dis[fa][0]+1>=dis[u][0])
            {
                dis[u][1] = dis[u][0];
                dis[u][0] = dis[fa][0]+1;
            }
            else
            {
                dis[u][1] = max(dis[u][1],dis[fa][0]+1);
            }
        }
    }

    mmx = max(mmx,dis[u][0]+dis[u][1]);
    //cout<<u<<' '<<mx[u]<<' '<<dis[u][0]<<' '<<dis[u][1]<<endl;

    for(int v:G[u])
    {
        if(v==fa) continue;
        dfs1(v,u);
    }
}

void dfs2(int u,int fa,int d)
{
    t[u] = (d+da-1)/da;
    for(int v:G[u])
    {
        if(v==fa) continue;
        dfs2(v,u,d+1);
    }
}

void dfs3(int u,int fa,int d)
{
//	if(!is) return ;
    int tt = (d+db-1)/db;

    cout<<tt<<' '<<t[u]<<endl;
    cout<<u<<' '<<mx[u]<<' '<<dis[u][0]<<' '<<dis[u][1]<<endl;

    //if(tt+1<t[u]&&dis[u][0]>=2*da+1&&db>=2*da+1) is = 0;
    if(t[u]&&dis[u][0]>=2*da+1&&db>=2*da+1) is = 0;
    for(int v:G[u])
    {
        if(v==fa) continue;
        dfs3(v,u,d+1);
    }
}

int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        is = 0;
        mmx = 0;

        cin>>n>>a>>b>>da>>db;
        rep(i,1,n+1) G[i].clear();

        rep(i,0,n-1)
        {
            int x,y;
            cin>>x>>y;
            G[x].push_back(y);
            G[y].push_back(x);
        }

        dfs0(1,1);
        dfs1(1,1);

        dfs2(a,a,0);
        //dfs3(b,b,0);

        //cout<<t[b]<<' '<<mmx<<endl;
        if(t[b]<=1||mmx<2*da+1||db<2*da+1) is = 1;

        cout<<(is?"Alice":"Bob")<<endl;
    }
}
/*
1
4 2 4 1 3
1 2
2 3
3 4

1
3 2 3 1 3
1 2
2 3

1
3 2 3 1 3
1 2
2 3
*/


#include<bits/stdc++.h>
using namespace std;
#define sz(a) ((int)a.size())
#define rep(i,a,b) for(ll i = (a);i < (b);(i)++)
#define per(i,a,b) for(ll i = (b-1);i >= (a);(i)--)
const int maxn = 1e6+10;
typedef long long ll;

int n,a,b,da,db,c;
vector<int>G[maxn];
int dis[maxn][2],mx[maxn],t[maxn];

bool is;

void dfs0(int u,int fa)
{
	bool f = 0;
	dis[u][0] = dis[u][1] = 0;
	for(int v:G[u])
	{
		if(v==fa) continue;
		f = 1;
		dfs0(v,u);
		if(dis[v][0]+1>=dis[u][0])
		{
			dis[u][1] = dis[u][0];
			dis[u][0] = dis[v][0]+1;
		}
		else
		{
			dis[u][1] = max(dis[u][1],dis[v][0]+1);
		}
	}
}

void dfs1(int u,int fa)
{
	bool f = 0;
	if(u==fa)
	{
		mx[u] = dis[u][0];
	}
	else
	{
		if(dis[u][0]+1==dis[fa][0])
		{
			if(dis[fa][1]+1>=dis[u][0])
			{
				dis[u][1] = dis[u][0];
				dis[u][0] = dis[fa][1]+1;
			}
			else
			{
				dis[u][1] = max(dis[u][1],dis[fa][1]+1);
			}
		}
		else
		{
			if(dis[fa][0]+1>=dis[u][0])
			{
				dis[u][1] = dis[u][0];
				dis[u][0] = dis[fa][0]+1;
			}
			else
			{
				dis[u][1] = max(dis[u][1],dis[fa][0]+1);
			}
		}
	}

	//cout<<u<<' '<<mx[u]<<' '<<dis[u][0]<<' '<<dis[u][1]<<endl;

	for(int v:G[u])
	{
		if(v==fa) continue;
		dfs1(v,u);
	}
}

void dfs2(int u,int fa,int d)
{
	t[u] = (d+da-1)/da;
	for(int v:G[u])
	{
		if(v==fa) continue;
		dfs2(v,u,d+1);
	}
}

void dfs3(int u,int fa,int d)
{
	if(!is) return ;
	int tt = (d+db-1)/db;

//	cout<<tt<<' '<<t[u]<<endl;
//	cout<<u<<' '<<mx[u]<<' '<<dis[u][0]<<' '<<dis[u][1]<<endl;

	if(tt+2<t[u]&&dis[u][0]>=2*da+1&&db>=2*da+1) is = 0;
	for(int v:G[u])
	{
		if(v==fa) continue;
		dfs3(v,u,d+1);
	}
}

int main()
{
	int T;
	cin>>T;
	while(T--)
	{
		is = 1;

		cin>>n>>a>>b>>da>>db;
		rep(i,1,n+1) G[i].clear();

		rep(i,0,n-1)
		{
			int x,y;
			cin>>x>>y;
			G[x].push_back(y);
			G[y].push_back(x);
		}

		int r = 1;
		rep(i,1,n+1)
		{
			if(sz(G[i])==1)
			{
				r = i;
				break;
			}
		}

		dfs0(r,r);
		dfs1(r,r);

		dfs2(a,a,0);
		dfs3(b,b,0);

		//if(t[b]<=1) is = 1;

		cout<<(is?"Alice":"Bob")<<endl;
	}
}
/*
??111??
*/


/*
若ab>da&&db>da*2&&maxd>da*2
分类讨论直径的位置，b一定能跑到一个安全的位置
*/
#include<bits/stdc++.h>
using namespace std;
#define sz(a) ((int)a.size())
#define rep(i,a,b) for(ll i = (a);i < (b);(i)++)
#define per(i,a,b) for(ll i = (b-1);i >= (a);(i)--)
const int maxn = 1e6+10;
typedef long long ll;

int n,a,b,da,db,d;
vector<int>G[maxn];
int dp[maxn][2],dis[maxn];

bool is;

void dfs(int u,int fa)
{
    dp[u][0] = dp[u][1] = 0;
    for(int v:G[u])
    {
        if(v==fa) continue;

        dis[v] = dis[u]+1;
        dfs(v,u);

        if(dp[v][0]+1>=dp[u][0])
        {
            dp[u][1] = dp[u][0];
            dp[u][0] = dp[v][0]+1;
        }
        else if(dp[v][0]+1>dp[u][1])
        {
            dp[u][1] = max(dp[u][1],dp[v][0]+1);
        }
    }

    d = max(d,dp[u][0]+dp[u][1]);
}

int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        cin>>n>>a>>b>>da>>db;
        rep(i,1,n+1) G[i].clear();

        rep(i,0,n-1)
        {
            int x,y;
            cin>>x>>y;
            G[x].push_back(y);
            G[y].push_back(x);
        }

        is = 1;
        d = dis[a] = 0;

        dfs(a,a);

        if(dis[b]>da&&d>da*2&&db>da*2) is = 0;

        cout<<(is?"Alice":"Bob")<<endl;
    }
}
/*
1
4 2 4 1 3
1 2
2 3
3 4

1
6 2 5 2 5
1 2
2 3
3 4
4 5
5 6
*/


#include<bits/stdc++.h>
using namespace std;
#define sz(a) ((int)a.size())
#define rep(i,a,b) for(ll i = (a);i < (b);(i)++)
#define per(i,a,b) for(ll i = (b-1);i >= (a);(i)--)
const int maxn = 1e6+10;
typedef long long ll;

int n,a,b,da,db,c;
vector<int>G[maxn];
int dis[maxn][2],mx[maxn],t[maxn];

bool is;

void dfs0(int u,int fa)
{
	bool f = 0;
	dis[u][0] = dis[u][1] = 0;
	for(int v:G[u])
	{
		if(v==fa) continue;
		f = 1;
		dfs0(v,u);
		if(dis[v][0]+1>=dis[u][0])
		{
			dis[u][1] = dis[u][0];
			dis[u][0] = dis[v][0]+1;
		}
		else
		{
			dis[u][1] = max(dis[u][1],dis[v][0]+1);
		}
	}
}

void dfs1(int u,int fa)
{
	bool f = 0;
	if(u==fa)
	{
		mx[u] = dis[u][0];
	}
	else
	{
		if(dis[u][0]+1==dis[fa][0])
		{
			if(dis[fa][1]+1>=dis[u][0])
			{
				dis[u][1] = dis[u][0];
				dis[u][0] = dis[fa][1]+1;
			}
			else
			{
				dis[u][1] = max(dis[u][1],dis[fa][1]+1);
			}
		}
		else
		{
			if(dis[fa][0]+1>=dis[u][0])
			{
				dis[u][1] = dis[u][0];
				dis[u][0] = dis[fa][0]+1;
			}
			else
			{
				dis[u][1] = max(dis[u][1],dis[fa][0]+1);
			}
		}
	}

	//cout<<u<<' '<<mx[u]<<' '<<dis[u][0]<<' '<<dis[u][1]<<endl;

	for(int v:G[u])
	{
		if(v==fa) continue;
		dfs1(v,u);
	}
}

void dfs2(int u,int fa,int d)
{
	t[u] = (d+da-1)/da;
	for(int v:G[u])
	{
		if(v==fa) continue;
		dfs2(v,u,d+1);
	}
}

void dfs3(int u,int fa,int d)
{
	if(!is) return ;
	int tt = (d+db-1)/db;

//	cout<<tt<<' '<<t[u]<<endl;
//	cout<<u<<' '<<mx[u]<<' '<<dis[u][0]<<' '<<dis[u][1]<<endl;

	if(tt+1<t[u]&&dis[u][0]>=2*da+1&&db>=2*da+1) is = 0;
	for(int v:G[u])
	{
		if(v==fa) continue;
		dfs3(v,u,d+1);
	}
}

int main()
{
	int T;
	cin>>T;
	while(T--)
	{
		is = 1;

		cin>>n>>a>>b>>da>>db;
		rep(i,1,n+1) G[i].clear();

		rep(i,0,n-1)
		{
			int x,y;
			cin>>x>>y;
			G[x].push_back(y);
			G[y].push_back(x);
		}

		int r = 1;
		rep(i,1,n+1)
		{
			if(sz(G[i])==1)
			{
				r = i;
				break;
			}
		}

		dfs0(r,r);
		dfs1(r,r);

		dfs2(a,a,0);
		dfs3(b,b,0);

		//if(t[b]<=1) is = 1;

		cout<<(is?"Alice":"Bob")<<endl;
	}
}
/*
1
4 2 4 1 3
1 2
2 3
3 4
*/


#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
ll gcd(ll a, ll b) { for (; b; a %= b, swap(a, b)); return a; }
int dx[4] = { 1, 0, 0, 0 };
int dy[4] = { 0, 1, 1, -1 };
#define INF 101112987654321
vector<vector<ll>> graph(100002);
ll longest = 0, len = 0, dist;
ll n, a, b, da, db;
bool visit[100002];

void dfs(ll v, ll length)
{
    visit[v] = true;
    for (ll to : graph[v])
    {
        if (!visit[to])
        {
            dfs(to, length + 1);
        }
    }
    if (length > len)
    {
        len = length;
        longest = v;
    }
}

void bfs(ll v)
{
    queue<pll> q;
    q.push({ v, 0 });
    visit[v] = true;
    while (!q.empty())
    {
        auto top = q.front(); q.pop();
        if (top.first == b)
        {
            dist = top.second;
            break;
        }
        for (ll to : graph[top.first])
        {
            if (!visit[to])
            {
                visit[to] = true;
                q.push({ to, top.second + 1 });
            }
        }
    }
}
int main(void)
{
    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);
    ll t; cin >> t;
    while (t--)
    {
        cin >> n >> a >> b >> da >> db;
        for (ll i = 0; i < n - 1; i++)
        {
            ll u, v; cin >> u >> v;
            graph[u].push_back(v);
            graph[v].push_back(u);
        }
        dfs(1, 0);
        memset(visit, false, sizeof visit);
        dfs(longest, 0);
        memset(visit, false, sizeof visit);
        bfs(a);
        memset(visit, false, sizeof visit);
        if (dist <= da)
        {
            cout << "Alice" << "\n";
        }
        else if (2 * da >= len)
        {
            cout << "Alice" << "\n";
        }
        else if (db > 2 * da)
        {
            cout << "Bob" << "\n";
        }
        else
        {
            cout << "Alice" << "\n";
        }
        for (ll i = 1; i <= n; i++) graph[i].clear();
    }
}


#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
ll gcd(ll a, ll b) { for (; b; a %= b, swap(a, b)); return a; }
int dx[4] = { 1, -1, 0, 0 };
int dy[4] = { 0, 0, 1, -1 };
#define INF 101112987654321
vector<vector<ll>> graph(100002);
ll dist = 0, bdist = 0;
ll n, a, b, da, db;
bool visit[100002];

void bfs(ll v)
{
    queue<pll> q;
    q.push({ v, 0 });
    while (!q.empty())
    {
        pll top = q.front(); q.pop();
        if (top.first == b)
        {
            dist = top.second;
            break;
        }
        for (ll to : graph[top.first])
        {
            if (!visit[to])
            {
                visit[to] = true;
                q.push({ to, top.second + 1 });
            }
        }
    }
}

void dist_b(ll v)
{
    queue<pll> q;
    q.push({ v, 0 });
    while (!q.empty())
    {
        pll top = q.front(); q.pop();
        bdist = max(bdist, top.second);
        for (auto to : graph[top.first])
        {
            if (!visit[to])
            {
                visit[to] = true;
                q.push({ to, top.second + 1 });
            }
        }
    }
}
int main(void)
{
    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);
    ll t; cin >> t;
    while (t--)
    {
        cin >> n >> a >> b >> da >> db;
        for (ll i = 0; i < n - 1; i++)
        {
            ll u, v; cin >> u >> v;
            graph[u].push_back(v);
            graph[v].push_back(u);
        }
        bfs(a);
        memset(visit, false, sizeof visit);
        dist_b(b);
        if (da >= dist || da > db)
        {
            cout << "Alice" << "\n";
            continue;
        }
        ll k = dist % da;
        if (k == 0) k += da;
        if (min(bdist, db - k) <= da) cout << "Alice" << "\n";
        else cout << "Bob" << "\n";
        for (ll i = 1; i <= n; i++) graph[i].clear();
        memset(visit, false, sizeof visit);
        bdist = 0, dist = 0;
    }
}


#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
ll gcd(ll a, ll b) { for (; b; a %= b, swap(a, b)); return a; }
int dx[4] = { 1, -1, 0, 0 };
int dy[4] = { 0, 0, 1, -1 };
#define INF 101112987654321
vector<vector<ll>> graph(100002);
ll dist = 0, bdist = 0;
ll n, a, b, da, db;
bool visit[100002];

void bfs(ll v)
{
    queue<pll> q;
    q.push({ v, 0 });
    visit[v] = true;
    while (!q.empty())
    {
        pll top = q.front(); q.pop();
        if (top.first == b)
        {
            dist = top.second;
            break;
        }
        for (ll to : graph[top.first])
        {
            if (!visit[to])
            {
                visit[to] = true;
                q.push({ to, top.second + 1 });
            }
        }
    }
}

void dist_b(ll v)
{
    queue<pll> q;
    q.push({ v, 0 });
    visit[v] = true;
    while (!q.empty())
    {
        pll top = q.front(); q.pop();
        bdist = max(bdist, top.second);
        for (auto to : graph[top.first])
        {
            if (!visit[to])
            {
                visit[to] = true;
                q.push({ to, top.second + 1 });
            }
        }
    }
}
int main(void)
{
    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);
    ll t; cin >> t;
    while (t--)
    {
        cin >> n >> a >> b >> da >> db;
        for (ll i = 0; i < n - 1; i++)
        {
            ll u, v; cin >> u >> v;
            graph[u].push_back(v);
            graph[v].push_back(u);
        }
        bfs(a);
        memset(visit, false, sizeof visit);
        dist_b(b);
        if (da >= dist || da > db)
        {
            cout << "Alice" << "\n";
            continue;
        }
        if (min(bdist, db - da) <= da) cout << "Alice" << "\n";
        else cout << "Bob" << "\n";
        for (ll i = 1; i <= n; i++) graph[i].clear();
        memset(visit, false, sizeof visit);
        bdist = 0, dist = 0;
    }
}


#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
ll gcd(ll a, ll b) { for (; b; a %= b, swap(a, b)); return a; }
int dx[4] = { 1, -1, 0, 0 };
int dy[4] = { 0, 0, 1, -1 };
#define INF 101112987654321
vector<vector<ll>> graph(100002);
ll dist = 0;
ll n, a, b, da, db;
bool visit[100002];

void bfs(ll v)
{
    queue<pll> q;
    q.push({ v, 0 });
    while (!q.empty())
    {
        pll top = q.front(); q.pop();
        if (top.first == b)
        {
            dist = top.second;
            break;
        }
        for (ll to : graph[top.first])
        {
            if (!visit[to])
            {
                visit[to] = true;
                q.push({ to, top.second + 1 });
            }
        }
    }
}
int main(void)
{
    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);
    ll t; cin >> t;
    while (t--)
    {
        memset(visit, false, sizeof visit);
        cin >> n >> a >> b >> da >> db;
        for (ll i = 0; i < n - 1; i++)
        {
            ll u, v; cin >> u >> v;
            graph[u].push_back(v);
            graph[v].push_back(u);
        }
        bfs(a);
        if (da >= dist || da > db)
        {
            cout << "Alice" << "\n";
            continue;
        }
        ll k = dist % da;
        if (db - k <= da) cout << "Alice" << "\n";
        else cout << "Bob" << "\n";
        for (ll i = 1; i <= n; i++) graph[i].clear();
    }
}


#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
ll gcd(ll a, ll b) { for (; b; a %= b, swap(a, b)); return a; }
int dx[4] = { 1, 0, 0, 0 };
int dy[4] = { 0, 1, 1, -1 };
#define INF 101112987654321
vector<vector<ll>> graph(100002);
ll longest = 0, len = 0, dist;
ll n, a, b, da, db;
bool visit[100002];

void dfs(ll v, ll length)
{
    visit[v] = true;
    for (ll to : graph[v])
    {
        if (!visit[to])
        {
            dfs(to, length + 1);
        }
    }
    if (length > len)
    {
        len = length;
        longest = v;
    }
}

void bfs(ll v)
{
    queue<pll> q;
    q.push({ v, 0 });
    visit[v] = true;
    while (!q.empty())
    {
        auto top = q.front(); q.pop();
        if (top.first == b)
        {
            dist = top.second;
            break;
        }
        for (ll to : graph[top.first])
        {
            if (!visit[to])
            {
                visit[to] = true;
                q.push({ to, top.second + 1 });
            }
        }
    }
}
int main(void)
{
    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);
    ll t; cin >> t;
    while (t--)
    {
        cin >> n >> a >> b >> da >> db;
        for (ll i = 0; i < n - 1; i++)
        {
            ll u, v; cin >> u >> v;
            graph[u].push_back(v);
            graph[v].push_back(u);
        }
        dfs(1, 0);
        memset(visit, false, sizeof visit);
        dfs(longest, 0);
        memset(visit, false, sizeof visit);
        bfs(a);
        memset(visit, false, sizeof visit);
        if (dist <= da)
        {
            cout << "Alice" << "\n";
        }
        else if (2 * da >= len)
        {
            cout << "Alice" << "\n";
        }
        else if (db > 2 * da)
        {
            cout << "Bob" << "\n";
        }
        else
        {
            cout << "Alice" << "\n";
        }
        for (ll i = 1; i <= n; i++) graph[i].clear();
        longest = len = dist = 0;
    }
}


#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
ll gcd(ll a, ll b) { for (; b; a %= b, swap(a, b)); return a; }
int dx[4] = { 1, -1, 0, 0 };
int dy[4] = { 0, 0, 1, -1 };
#define INF 101112987654321
vector<vector<ll>> graph(100002);
ll dist = 0, bdist = 0;
ll n, a, b, da, db;
bool visit[100002];

void bfs(ll v)
{
    queue<pll> q;
    q.push({ v, 0 });
    while (!q.empty())
    {
        pll top = q.front(); q.pop();
        if (top.first == b)
        {
            dist = top.second;
            break;
        }
        for (ll to : graph[top.first])
        {
            if (!visit[to])
            {
                visit[to] = true;
                q.push({ to, top.second + 1 });
            }
        }
    }
}

void dist_b(ll v)
{
    queue<pll> q;
    q.push({ v, 0 });
    while (!q.empty())
    {
        pll top = q.front(); q.pop();
        bdist = max(bdist, top.second);
        for (auto to : graph[top.first])
        {
            if (!visit[to])
            {
                visit[to] = true;
                q.push({ to, top.second + 1 });
            }
        }
    }
}
int main(void)
{
    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);
    ll t; cin >> t;
    while (t--)
    {
        cin >> n >> a >> b >> da >> db;
        for (ll i = 0; i < n - 1; i++)
        {
            ll u, v; cin >> u >> v;
            graph[u].push_back(v);
            graph[v].push_back(u);
        }
        bfs(a);
        memset(visit, false, sizeof visit);
        dist_b(b);
        if (da >= dist || da > db)
        {
            cout << "Alice" << "\n";
            continue;
        }
        ll k = dist % da;
        if (k == 0) k += da;
        if (min(bdist, db - k) <= da) cout << "Alice" << "\n";
        else cout << "Bob" << "\n";
        for (ll i = 1; i <= n; i++) graph[i].clear();
        memset(visit, false, sizeof visit);
    }
}


#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
ll gcd(ll a, ll b) { for (; b; a %= b, swap(a, b)); return a; }
int dx[4] = { 1, -1, 0, 0 };
int dy[4] = { 0, 0, 1, -1 };
#define INF 101112987654321
vector<vector<ll>> graph(100002);
ll dist = 0, bdist = 0;
ll n, a, b, da, db;
bool visit[100002];

void bfs(ll v)
{
    queue<pll> q;
    q.push({ v, 0 });
    visit[v] = true;
    while (!q.empty())
    {
        pll top = q.front(); q.pop();
        if (top.first == b)
        {
            dist = top.second;
            break;
        }
        for (ll to : graph[top.first])
        {
            if (!visit[to])
            {
                visit[to] = true;
                q.push({ to, top.second + 1 });
            }
        }
    }
}

void dist_b(ll v)
{
    queue<pll> q;
    q.push({ v, 0 });
    visit[v] = true;
    while (!q.empty())
    {
        pll top = q.front(); q.pop();
        bdist = max(bdist, top.second);
        for (auto to : graph[top.first])
        {
            if (!visit[to])
            {
                visit[to] = true;
                q.push({ to, top.second + 1 });
            }
        }
    }
}
int main(void)
{
    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);
    ll t; cin >> t;
    while (t--)
    {
        cin >> n >> a >> b >> da >> db;
        for (ll i = 0; i < n - 1; i++)
        {
            ll u, v; cin >> u >> v;
            graph[u].push_back(v);
            graph[v].push_back(u);
        }
        bfs(a);
        memset(visit, false, sizeof visit);
        dist_b(b);
        if (da >= dist || da > db)
        {
            cout << "Alice" << "\n";
            continue;
        }
        ll k = dist % da;
        if (k == 0) k += da;
        if (min(bdist, db - k) <= da) cout << "Alice" << "\n";
        else cout << "Bob" << "\n";
        for (ll i = 1; i <= n; i++) graph[i].clear();
        memset(visit, false, sizeof visit);
        bdist = 0, dist = 0;
    }
}


#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
ll gcd(ll a, ll b) { for (; b; a %= b, swap(a, b)); return a; }
int dx[4] = { 1, 0, 0, 0 };
int dy[4] = { 0, 1, 1, -1 };
#define INF 101112987654321
vector<vector<ll>> graph(100002);
ll longest = 0, len = 0, dist;
ll n, a, b, da, db;
bool visit[100002];

void dfs(ll v, ll length)
{
    visit[v] = true;
    for (ll to : graph[v])
    {
        if (!visit[to])
        {
            dfs(to, length + 1);
        }
    }
    if (length > len)
    {
        len = length;
        longest = v;
    }
}

void bfs(ll v)
{
    queue<pll> q;
    q.push({ v, 0 });
    visit[v] = true;
    while (!q.empty())
    {
        auto top = q.front(); q.pop();
        if (top.first == b)
        {
            dist = top.second;
            break;
        }
        for (ll to : graph[top.first])
        {
            if (!visit[to])
            {
                visit[to] = true;
                q.push({ to, top.second + 1 });
            }
        }
    }
}
int main(void)
{
    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);
    ll t; cin >> t;
    while (t--)
    {
        cin >> n >> a >> b >> da >> db;
        for (ll i = 0; i < n - 1; i++)
        {
            ll u, v; cin >> u >> v;
            graph[u].push_back(v);
            graph[v].push_back(u);
        }
        dfs(1, 0);
        memset(visit, false, sizeof visit);
        dfs(longest, 0);
        memset(visit, false, sizeof visit);
        bfs(a);
        memset(visit, false, sizeof visit);
        if (dist <= da)
        {
            cout << "Alice" << "\n";
        }
        else if (2 * da >= len)
        {
            cout << "Alice" << "\n";
        }
        else if (db > 2 * da)
        {
            // a가 최대 da거리 차이로 b를 좁힐 수 있고 b는 트리의 끝점까지 도망갈 수 있음
            // 여기서 b가 da거리를 뛰어 넘고 또 da거리 이상 도망가야 a에게 잡히지 않음
            // 2 * da < diameter이므로 트리의 끝점에서 b가 도망칠 공간은 충분함(경로가 없어서 잡히는 경우x)
            cout << "Bob" << "\n";
        }
        else
        {
            // 반대로 db가 2 * da보다 작은 값이라면 뛰어 넘고 도망가는 거리가 되지 못하므로 a에게 잡힘
            cout << "Alice" << "\n";
        }
        for (ll i = 1; i <= n; i++) graph[i].clear();
        longest = len = dist = 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=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;
    }
    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]);
    }

    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;
}