#include<bits/stdc++.h>
using namespace std;
#define int long long int
#define pll pair<ll,ll>
#define vi vector < int >
#define pii pair<int,int>
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define all(a) (a).begin(),(a).end()
#define s(x) scanf("%d",&x)
#define sll(x) scanf("%lld",&x)
#define pf(x) printf("%d\n",x)
#define pfl(x) printf("%lld\n",x)
#define flash ios_base::sync_with_stdio(false);cin.tie(0)
#define goog(x) cout << "Case #" << x << ": "
#define MAX5 200005
#define MAX6 2000005
#define MLOG 18
#define limit 1e18
#define mod 1000000007   
void __print(int x) {cerr << x;}
void __print(unsigned x) {cerr << x;}
void __print(unsigned long x) {cerr << x;}
void __print(unsigned long long x) {cerr << x;}
void __print(float x) {cerr << x;}
void __print(double x) {cerr << x;}
void __print(long double x) {cerr << x;}
void __print(char x) {cerr << '\'' << x << '\'';}
void __print(const char *x) {cerr << '\"' << x << '\"';}
void __print(const string &x) {cerr << '\"' << x << '\"';}
void __print(bool x) {cerr << (x ? "true" : "false");}
 
template<typename T, typename V>
void __print(const pair<T, V> &x) {cerr << '{'; __print(x.first); cerr << ','; __print(x.second); cerr << '}';}
template<typename T>
void __print(const T &x) {int f = 0; cerr << '{'; for (auto &i: x) cerr << (f++ ? "," : ""), __print(i); cerr << "}";}
void _print() {cerr << "]\n";}
template <typename T, typename... V>
void _print(T t, V... v) {__print(t); if (sizeof...(v)) cerr << ", "; _print(v...);}
#ifndef ONLINE_JUDGE
#define debug(x...) cerr << "[" << #x << "] = ["; _print(x)
#else
#define debug(x...)
#endif
 
 
int power(int x, int y, int p){
    int res = 1;
    x = x % p;
    while (y > 0){
        if (y & 1)
            res = (res*x) % p;
        y = y>>1;
        x = (x*x) % p;
    }
    return res;
}
vector < int > v[MAX5];
int ans1[MAX5], ans2[MAX5];
 
int bfs1(int u){
    queue < int > q;
    q.push(u);
    ans1[u] = 0;
    while(!q.empty()){
        int x = q.front();
        q.pop();
        for(auto e : v[x]){
            if(ans1[e] > ans1[x] + 1){
                ans1[e] = ans1[x] + 1;
                q.push(e);
            }
        }
    }
}   
int bfs2(int u){
    queue < int > q;
    q.push(u);
    ans2[u] = 0;
    while(!q.empty()){
        int x = q.front();
        q.pop();
        for(auto e : v[x]){
            if(ans2[e] > ans2[x] + 1){
                ans2[e] = ans2[x] + 1;
                q.push(e);
            }
        }
    }
}   
void solve(){
    int n, u, ff;
    cin >> n >> u >> ff;
    if(n == 2){
        cout << 0 << endl;
        return;
    }
    for(int i = 1; i <= n; i++) ans1[i] = limit;
    for(int i = 1; i <= n; i++) ans2[i] = limit;
    for(int i = 0; i < n-1; i++){
        int a, b;
        cin >> a >> b;
        v[a].pb(b);
        v[b].pb(a);
    }
    bfs1(u);
    bfs2(ff);
    int ans = 0, aa = limit;
    for(int i = 1; i <= n; i++){
        if(ans2[i] > ans1[i]){
            ans = max(ans, ans2[i]);
        }
        //debug(ans1[i] , ans2[i]);
    }
    if(aa == limit) aa = -1;
    cout << ans-1;
} 
signed main(){  
//  freopen("ii.txt", "w", stdin);
    flash;
    int t = 1;
    //  cin >> t;  
    for(int tc = 1; tc <= t; tc++){
    //goog(tc);
        solve();
    }
}

Measured memory_bytes: 13184