// https://atcoder.jp/contests/past-sample/tasks/abc129_d

// config 

const int __SETW__ = 6;

// IO
#include <iostream>      // cin, cout
#include <iomanip>       // setw
// MATH & ALGROTHM
#include <cmath>
#include <complex>
#include <numeric>
#include <algorithm>
// CONTAINER 
#include <tuple>
#include <string>      
#include <vector>
#include <deque>
#include <queue>  
#include <stack>
#include <map>       
#include <unordered_map>
#include <set>
#include <unordered_set>
#include <list>
// FUNCTION
#include <functional>
// META
#include <type_traits>
 
/////// 
using std::cin;
using std::cout;
using std::endl;

using INT = long long int;
const INT INF = INT(1) << 60;

#define FOR(i, N) for( INT i = 0; i < N; i++ )
#define FORR(i, N) for( INT i = (N-1); i >= 0; i-- )
#define RANGE(v) begin(v), end(v)

using VEC = std::vector<INT>;
using VECVEC = std::vector<VEC>;
using VECVECVEC = std::vector<VEC>;

template< class T >
T safe_get ( const std::vector<T>& v, INT idx, T def = -1 ){
    if( idx < 0 || v.size() <= idx ){
        return def;
    } else {
        return v[idx];
    }
}
template< class T >
T safe_get ( const std::vector< std::vector<T> >& vv, INT idx1, INT idx2, T def = -1 ){
    if( idx1 < 0 || vv.size() <= idx1 ){
        return def;
    } else {
        return safe_get(vv[idx1], idx2, def );
    }
}

template< class T, class F >
inline bool ANY( T sequence, F func ){
    for(  auto&& t : sequence ){
        if( func(t) ){ return true; }
    }
    return false;
}
template< class T, class F >
inline bool ALL( T sequence, F func ){
    for(  auto&& t : sequence ){
        if( ! func(t) ){ return false; }
    }
    return true;
}

template< class T >
std::ostream& operator<< ( std::ostream& lhs, const std::priority_queue<T>& rhs ){
    std::queue<T> copy = rhs;
    while( !copy.empty() ){
        lhs << std::setw(__SETW__) << copy.front() << " ";
        copy.pop();
    }
    return lhs;
}
template< class T >
std::ostream& operator<< ( std::ostream& lhs, const std::queue<T>& rhs ){
    std::queue<T> copy = rhs;
    while( !copy.empty() ){
        lhs << std::setw(__SETW__) << copy.front() << " ";
        copy.pop();
    }
    return lhs;
}
template< class T >
std::ostream& operator<< ( std::ostream& lhs, const std::stack<T>& rhs ){
    std::stack<T> copy = rhs;
    while( !copy.empty() ){
        lhs << std::setw(__SETW__) << copy.top() << " ";
        copy.pop();
    }
    return lhs;
}

template< class T >
std::ostream& operator<< ( std::ostream& lhs, const std::vector< std::vector<T> >& rhs ){
    for( auto&& v : rhs ){
        lhs << v << endl;
    }
    return lhs;
}
template< class T >
std::ostream& operator<< ( std::ostream& lhs, const std::vector<T>& rhs ){
    for( auto&& t : rhs ){
        lhs << std::setw(__SETW__) << t << " ";
    }
    return lhs;
}
template< class T >
std::ostream& operator<< ( std::ostream& lhs, const std::list<T>& rhs ){
    for( auto&& t : rhs ){
        lhs << std::setw(__SETW__) << t << " ";
    }
    return lhs;
}

template< class T1, class T2 >
std::ostream& operator<< ( std::ostream& lhs, const std::map<T1, T2>& rhs ){
    for( auto&& m : rhs ){
        lhs << std::setw(__SETW__) << m.first << ":" << std::setw(__SETW__) << m.second << endl;
    }
    return lhs;
}
template< class T1, class T2 >
std::ostream& operator<< ( std::ostream& lhs, const std::multimap<T1, T2>& rhs ){
    for( auto&& m : rhs ){
        lhs << std::setw(__SETW__) << m.first << ":" << std::setw(__SETW__) << m.second << endl;
    }
    return lhs;
}
template< class T >
std::ostream& operator<< ( std::ostream& lhs, const std::set<T>& rhs ){
    for( auto&& t : rhs ){
        lhs << std::setw(__SETW__) << t << " ";
    }
    return lhs;
}
template< class T >
std::ostream& operator<< ( std::ostream& lhs, const std::multiset<T>& rhs ){
    for( auto&& t : rhs ){
        lhs << std::setw(__SETW__) << t << " ";
    }
    return lhs;
}

template< class T >
std::ostream& operator<< ( std::ostream& lhs, const std::complex<T>& rhs ){
    std::streamsize ss = lhs.precision();
    lhs << "(" << std::setw(5) << std::setprecision(4) << rhs.real() << ","
               << std::setw(5) << std::setprecision(4) << rhs.imag() << ") ";
    lhs.precision(ss);
    return lhs;
}
template< class T1, class T2 >
std::ostream& operator<< ( std::ostream& lhs, const std::pair<T1, T2>& rhs ){
    lhs << "(" << rhs.first << "," << rhs.second << ")";
    return lhs;
}

template< class T >
T chmax( T& lhs, const T& rhs){
    lhs = std::max( lhs, rhs);
    return lhs;
}
template< class T >
T chmin( T& lhs, const T& rhs){
    lhs = std::min( lhs, rhs);
    return lhs;
}

using namespace std;

struct Node {
    vector<Node*> children;
    INT depth;
    INT id;
    INT pid;
};

int main(){
    INT N, u, v;
    cin >> N >> u >> v;

    unordered_multimap<INT, INT> path;
    FOR(i, N-1){
        INT A, B;
        cin >> A >> B;
        path.emplace(A, B);
        path.emplace(B, A);
    }

    vector<Node> nodes(N+1);

    Node& root = nodes[v];
    root.depth = 0;
    root.id    = v;
    root.pid   = -1;

    auto treeBuild = [&](auto treeBuild, INT pid, INT id, INT depth, vector<Node*>& children_vec ) -> void {
        auto range = path.equal_range( id );
        auto it = range.first;
        while( it != range.second ){
            INT cid = it->second;
            if( cid != pid ){
                nodes[cid].depth = depth+1;
                nodes[cid].id = cid;
                nodes[cid].pid = id;
                children_vec.emplace_back(&nodes[cid]);
                treeBuild( treeBuild, nodes[cid].pid, nodes[cid].id, nodes[cid].depth, nodes[cid].children );
            }
            it++;
        }
    }; 
    treeBuild( treeBuild, root.pid, root.id, root.depth, root.children );

    auto max_depth = []( auto max_depth, Node& node, INT depth, INT ignore_id )->INT {
        INT ret = depth;
        for( Node* child : node.children ){
            if ( child->id != ignore_id ){
                chmax( ret, max_depth(max_depth, *child, depth+1, ignore_id) );
            }
        }
        return ret;
    };

    INT ans = 0;
    INT d1 = nodes[u].depth;
    INT t = 0;
    INT idx = u;
    INT last_id = -2;
    do {
        INT d2 = max_depth(max_depth, nodes[u], 0, last_id);
        chmax( ans, (d1+d2-1+t) );
        last_id = nodes[u].id;
        u = nodes[u].pid;
        d1 -= 2;
        t++;
    } while (d1 > 0);

    cout << ans << endl;

    return 0;
}


Measured memory_bytes: 21192