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

#define all(v) (v).begin(), (v).end()

const int N = 1e6 + 5;

int n, T, M;
vector<int> adj[N];

int par[N], dep[N];
int weightNode[N];

vector<pair<int,int>> subtrees;

/*
    weightNode[u]:
    số bước tối thiểu để thắng
    nếu chuột đang ở u
    và chỉ được đi xuống subtree.
*/

void dfsWeight(int u, int p)
{
    par[u] = p;

    vector<int> child;

    for(int v : adj[u]){
        if(v == p) continue;

        dep[v] = dep[u] + 1;

        dfsWeight(v, u);

        child.push_back(weightNode[v]);
    }

    if(child.empty()){
        weightNode[u] = 0;
        return;
    }

    sort(all(child), greater<int>());

    if((int)child.size() == 1)
        weightNode[u] = child[0] + 1;
    else
        weightNode[u] = child[1] + 1;
}

/*
    Check có thể thắng trong <= X bước không.
*/

bool check(int X)
{
    vector<pair<int,int>> jobs;

    int u = M;
    int dist = 0;

    while(u != T){

        for(int v : adj[u]){
            if(v == par[u]) continue;

            jobs.push_back({dist, weightNode[v]});
        }

        u = par[u];
        ++dist;
    }

    /*
        jobs:
        (deadline, weight)

        cần block trước khi:
            blocked + weight > X
    */

    sort(all(jobs));

    int blocked = 0;

    for(auto [d, w] : jobs){

        if(d + blocked > X)
            return false;

        if(d + blocked + w > X){
            ++blocked;
        }
    }

    return true;
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    cin >> n >> T >> M;

    for(int i = 1; i < n; ++i){
        int u, v;
        cin >> u >> v;

        adj[u].push_back(v);
        adj[v].push_back(u);
    }

    dfsWeight(T, 0);

    int L = 0, R = n, ans = n;

    while(L <= R){
        int mid = (L + R) >> 1;

        if(check(mid)){
            ans = mid;
            R = mid - 1;
        }
        else{
            L = mid + 1;
        }
    }

    cout << ans << '\n';

    return 0;
}
