#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define rep(i, n) for(int i = 0; i < n; i++)

class Node {
    public:
        vector<int> children;
        vector<int> edge_value;
        int value;
        int parent;
};

class Tree {
    public:
        int root;
        int node_num;
        vector<Node> node;
        
        Tree(vector<vector<int>> hen, int r) {
            root = r;
            node_num = hen.size();
            node = vector<Node>(hen.size());
            
            queue<int> v;
            v.push(root);
            node[root].parent = -1;
            int edge_num = 0;
            while(!v.empty()) {
                int tyoten = v.front();
                node[tyoten].value = tyoten;
                v.pop();
                for (int i = 0; i < hen[tyoten].size(); i++) {
                    int child = hen[tyoten][i];
                    if (child != node[tyoten].parent) {
                        node[tyoten].children.push_back(child);
                        node[tyoten].edge_value.push_back(edge_num);
                        edge_num++;
                        node[child].parent = tyoten;
                        v.push(child);
                    }
                }
            }
        }
};

vector<int> tree_dist_bfs(Tree tree, Node node) {
    vector<int> dist(tree.node_num, -1);
    queue<pair<int, Node>> que;
    que.push(make_pair(0, node));
    while(!que.empty()) {
        pair<int, Node> p = que.front();
        que.pop();
        dist[p.second.value] = p.first;
        
        if (p.second.parent != -1)
            if (dist[p.second.parent] == -1)
                que.push(make_pair(p.first+1, tree.node[p.second.parent]));
        
        for (int i = 0; i < p.second.children.size(); i++)
            if (dist[p.second.children[i]] == -1)
                que.push(make_pair(p.first+1, tree.node[p.second.children[i]]));
    }
    
    return dist;
}

vector<int> bfs(Tree tree, Node node, vector<int> v_dist) {
    vector<int> dist(tree.node_num, -1);
    queue<pair<int, Node>> que;
    que.push(make_pair(0, node));
    
    while(!que.empty()) {
        pair<int, Node> p = que.front();
        que.pop();
        dist[p.second.value] = p.first;
        
        if (p.second.parent != -1)
            if (dist[p.second.parent] == -1 && v_dist[p.second.parent] > p.first+1)
                que.push(make_pair(p.first+1, tree.node[p.second.parent]));
        
        for (int i = 0; i < p.second.children.size(); i++)
            if (dist[p.second.children[i]] == -1 && v_dist[p.second.children[i]] > p.first+1)
                que.push(make_pair(p.first+1, tree.node[p.second.children[i]]));
    }
    
    return dist;
}

int main(void){
    int n, u, v;
    cin >> n >> u >> v;
    u--; v--;
    
    vector<vector<int>> hen(n);
    rep(i, n-1) {
        int a, b;
        cin >> a >> b;
        hen[a-1].push_back(b-1);
        hen[b-1].push_back(a-1);
    }
    
    Tree tree(hen, v);
    vector<int> v_dist = tree_dist_bfs(tree, tree.node[v]);
    vector<int> u_dist = bfs(tree, tree.node[u], v_dist);
    /*
    for (int i = 0; i < v_dist.size(); i++)
        cout << v_dist[i] << " ";
    cout << endl;
    for (int i = 0; i < u_dist.size(); i++)
        cout << u_dist[i] << " ";
    cout << endl;
    */
    int ans = 0;
    rep(i, v_dist.size()) {
        if (v_dist[i] != -1 && u_dist[i] != -1)
            ans = max(ans, v_dist[i]-1);
    }
    cout << ans << endl;
}

Measured memory_bytes: 29176