#include <bits/stdc++.h>
#define rep(i,n) for(int i=0;i<(int)(n);i++)
#define rrep(i,n) for(int i=(int)(n-1);i>=0;i--)
#define all(x) (x).begin(),(x).end()
#define sz(x) int(x.size())
#define get_unique(x) x.erase(std::unique(all(x)), x.end());
typedef long long ll;
const int INF = 1e9;
const ll MOD = 1e9+7;
const ll LINF = 1e18;
const double PI=acos(-1);
using namespace std;
template<class T>bool chmax(T &a, const T &b) { if (a<b) { a=b; return 1; } return 0; }
template<class T>bool chmin(T &a, const T &b) { if (b<a) { a=b; return 1; } return 0; }
template<class T>
vector<T> make_vec(size_t a){
    return vector<T>(a);
}
template<class T, class... Ts>
auto make_vec(size_t a, Ts... ts){
    return vector<decltype(make_vec<T>(ts...))>(a, make_vec<T>(ts...));
}

vector<int> d;
vector<vector<int>> g;
void bfs(int s) {
    int n=sz(g);
    d.resize(n);
    rep(i,n) d[i]=INF;
    queue<int> q;
    q.push(s);
    d[s]=0;
    while(sz(q)) {
        int now=q.front(); q.pop();
        for(int nxt:g[now]) {
            if(d[nxt]==INF) {
                q.push(nxt);
                d[nxt]=d[now]+1;
            }
        }
    }
}

int ans=0;
vector<bool> visited;
void dfs(int now,int pre,int cnt) {
    if(sz(g[now])==1 && visited[now]) {
        chmax(ans,d[now]-1);
        return;
    }
    for(int nxt:g[now])  {
        visited[nxt]=true;
        if(nxt==pre) {
            continue;
        }
        if(cnt==d[nxt]){
            chmax(ans,cnt);
            continue;
        }
        if(cnt+1==d[nxt]) {
            chmax(ans,cnt+1);
            continue;
        }
        if(cnt>=d[nxt] && (cnt-d[nxt])%2==0) {
            chmax(ans,cnt+1);
            continue;
        }
        dfs(nxt,now,cnt+1);
    }
}

int main() {
    int n,sa,st;
    cin>>n>>st>>sa;
    sa--;st--;
    g.resize(n);
    rep(i,n-1) {
        int a,b;
        cin>>a>>b;
        a--;b--;
        g[a].push_back(b);
        g[b].push_back(a);
    }

    ans=0;
    visited.resize(n);
    bfs(sa);
    dfs(st,-1,0);
    cout<<ans<<endl;
}