#include <bits/stdc++.h>
using namespace std;
 
#define forn(a, e) for (int a = 0; a < (int)(e); a++)
#define forr(a, s, e) for (int a = s; a < (int)(e); a++)
#define fore(e, a) for (auto& e : a)
 
#ifdef LOCAL
#define logv(a) {cerr << #a << " = "; fore(e, a) {cerr << e << " ";} cerr << "\n";}
#define logvp(a) {cerr << #a << " = "; fore(e, a) {cerr << "(" << e.first << ", " << e.second << ") ";} cerr << "\n";}
#define logvv(a) {cerr << #a << " = \n"; fore(r, a) { fore(e, r) {cerr << e << " ";} cerr << "\n";} }
#define logvf(a, field) {cerr << #a"."#field << " = \n"; fore(e, a) { cerr << e.field << " ";} cerr << "\n"; }
#define logvff(a, f1, f2) {cerr << #a".{"#f1 << ", "#f2 << "} = \n"; fore(e, a) { cerr << "(" << e.f1 <<", " << e.f2 << ") ";} cerr << "\n"; }
#define logs(a) cerr << #a << " = " << (a) << "\n";
#define logss(a, b) cerr << #a << " = " << (a) << ", " << #b << " = " << (b) << "\n";
#define logp(a) cerr << #a << " = " << "(" << a.first << ", " << a.second << ")" << "\n";
#define cond(pred, stmt) if (pred) { stmt }
#else
#define logv(a)
#define logvp(a)
#define logvv(a)
#define logvf(a, field)
#define logvff(a, f1, f2)
#define logs(a)
#define logss(a, b)
#define logp(a)
#define cond(pred, stmt)
#endif
 
using i64 = long long;
using iip = pair<i64, i64>;
using ivec = vector<int>;
using llvec = vector<i64>;
using svec = vector<string>;
template<typename T> using vec = vector<T>;
 
template<typename T, typename Dim>
auto make_vec(T value, Dim dim) { return vector<T>(dim, value); }
template<typename T, typename Dim1, typename... Dim>
auto make_vec(T value, Dim1 dim1, Dim... dims) { return make_vec(make_vec(value, dims...), dim1); }
 
template<typename T>
bool uax(T& v, const T& newv) { if (v < newv) { v = newv; return true; } else return false; }
template<typename T>
bool uin(T& v, const T& newv) { if (v > newv) { v = newv; return true; } else return false; }
 
template<typename T>
istream& operator>>(istream& is, vector<T>& c) { for (auto& e : c) is >> e; return is; }
 
// template<typename ...T>
// istream& read(T&... args) { return (cin >> ... >> args); }
 
static mt19937 rande(123123);
template<typename T>
T rand_int(T from, T to) { uniform_int_distribution<T> distr(from, to); return distr(rande); }
i64 gcd (i64 a, i64 b) {
	if (b == 0)
		return a;
	else
		return gcd (b, a % b);
}

int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
 
  int n, a, b;
  while (cin >> n >> a >> b) {
    a--;
    b--;

    vec<ivec> g(n);
    forn(i, n - 1) {
      int u, v;
      cin >> u >> v;
      u--; v--;
      g[u].push_back(v);
      g[v].push_back(u);
    }

    auto bfs = [&](int s, ivec& t) {
      ivec used(n);
      queue<int> q;
      q.push(s);
      used[s] = true;
      t[s] = 0;

      while (!q.empty()) {
        int v = q.front();
        q.pop();

        fore(u, g[v]) {
          if (!used[u]) {
            t[u] = t[v] + 1;
            used[u] = true;
            q.push(u);
          }
        }
      }
    };

    ivec ta(n);
    ivec tb(n);
    bfs(a, ta);
    bfs(b, tb);

    logv(ta);
    logv(tb);

    ivec used(n);
    forn(i, n) {
      if (ta[i] < tb[i]) {
        used[i] = true;
      }
    }

    vec<ivec> gg(n);
    forn(i, n) if (used[i]) {
      fore(v, g[i]) if (used[v]) {
        gg[i].push_back(v);
      }
    }

    logvv(gg);

    int tv = 0;
    int bv = -1;
    function<void(int, int)> dfs = [&](int v, int p) {
      if (uax(tv, tb[v])) {
        bv = v;
      }

      fore(u, gg[v]) if (u != p) {
        dfs(u, v);
      }
    };

    dfs(a, -1);
    logss(bv, tv);
    logss(tb[bv], ta[bv]);

    // if ((tb[bv] - ta[bv]) % 2 == 0) {
    //   tv--;
    // }
    cout << tv - 1 << endl; 
  }
}

Measured memory_bytes: 15992