#include <bits/stdc++.h>
using namespace std;
const int N = (int)3e5;
long long int mpow(long long int a, long long int b) {
  if (b == 0)
    return 1;
  else if (b % 2 == 0) {
    long long int memo = mpow(a, b / 2);
    return memo * memo % (long long int)(1e9 + 7);
  } else
    return mpow(a, b - 1) * a % (long long int)(1e9 + 7);
}
long long int lpow(long long int a, long long int b) {
  if (b == 0)
    return 1;
  else if (b % 2 == 0) {
    long long int memo = lpow(a, b / 2);
    return memo * memo;
  } else
    return lpow(a, b - 1) * a;
}
long long int gcd(long long int a, long long int b) {
  if (b == 0)
    return a;
  else
    return gcd(b, a % b);
}
vector<long long int> kaijo_memo;
long long int kaijo(long long int n) {
  if (kaijo_memo.size() > n) return kaijo_memo[n];
  if (kaijo_memo.size() == 0) kaijo_memo.push_back(1);
  while (kaijo_memo.size() <= n)
    kaijo_memo.push_back(kaijo_memo[kaijo_memo.size() - 1] * kaijo_memo.size() %
                         (long long int)(1e9 + 7));
  return kaijo_memo[n];
}
vector<long long int> gyaku_kaijo_memo;
long long int gyaku_kaijo(long long int n) {
  if (gyaku_kaijo_memo.size() > n) return gyaku_kaijo_memo[n];
  if (gyaku_kaijo_memo.size() == 0) gyaku_kaijo_memo.push_back(1);
  while (gyaku_kaijo_memo.size() <= n)
    gyaku_kaijo_memo.push_back(
        gyaku_kaijo_memo[gyaku_kaijo_memo.size() - 1] *
        mpow(gyaku_kaijo_memo.size(), (long long int)(1e9 + 7) - 2) %
        (long long int)(1e9 + 7));
  return gyaku_kaijo_memo[n];
}
long long int nCr(long long int n, long long int r) {
  if (n == r) return 1;
  if (n < r || r < 0) return 0;
  long long int ret = 1;
  ret *= kaijo(n);
  ret %= (long long int)(1e9 + 7);
  ret *= gyaku_kaijo(r);
  ret %= (long long int)(1e9 + 7);
  ret *= gyaku_kaijo(n - r);
  ret %= (long long int)(1e9 + 7);
  return ret;
}
vector<int> G[(int)(1e5 + 3)];
bool oni[(int)(1e5 + 3)], nige[(int)(1e5 + 3)];
bool checkOni[(int)(1e5 + 3)], checkNige[(int)(1e5 + 3)];
int main(void) {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  int u, v;
  int n;
  cin >> n >> u >> v;
  u--;
  v--;
  for (int i = 0; i < (int)(n - 1); i++) {
    int a, b;
    cin >> a >> b;
    a--;
    b--;
    G[a].push_back(b);
    G[b].push_back(a);
  }
  for (int i = 0; i < (int)(n); i++) {
    checkOni[i] = false;
    checkNige[i] = false;
    oni[i] = false;
    nige[i] = false;
  }
  queue<int> A, B;
  A.push(u);
  B.push(v);
  oni[v] = true;
  long long int countNige = 0;
  if (G[u].size() >= 2) {
    countNige++;
    nige[u] = true;
  }
  long long int ans = 0;
  while (true) {
    queue<int> neA, neB;
    while (A.size() > 0) {
      int a = A.front();
      A.pop();
      if (!nige[a] && a != u) {
        continue;
      }
      for (int j = 0; j < (int)(G[a].size()); j++) {
        int next = G[a][j];
        if (!checkNige[next] && !oni[next] && G[next].size() >= 2) {
          checkNige[next] = true;
          nige[next] = true;
          countNige++;
          neA.push(next);
        }
      }
    }
    if (countNige == 0) {
      break;
    }
    ans++;
    while (B.size() > 0) {
      int b = B.front();
      B.pop();
      for (int j = 0; j < (int)(G[b].size()); j++) {
        int next = G[b][j];
        if (!checkOni[next]) {
          checkOni[next] = true;
          oni[next] = true;
          if (nige[next]) {
            nige[next] = false;
            countNige--;
          }
          neB.push(next);
        }
      }
    }
    A = neA;
    B = neB;
    if (countNige == 0) {
      break;
    }
  }
  cout << ans << endl;
  return 0;
}
