#include <bits/stdc++.h>
using namespace std;
constexpr long long MOD = 1e9 + 7;
template <typename T>
using pq = priority_queue<T>;
template <typename T>
using pqr = priority_queue<T, vector<T>, greater<T>>;
const long long INF = LLONG_MAX / 2;
using P = pair<long long, long long>;
using vec = vector<long long>;
template <typename T>
using mat = vector<vector<T>>;
template <typename T1, typename T2>
ostream& operator<<(ostream& stream, const pair<T1, T2>& p) {
  return stream << p.first << "," << p.second;
}
template <typename T>
void print(const vector<T> vec) {
  for (long long i = (0); i <= static_cast<long long>(vec.size() - 1 - 1); i++)
    cout << vec[i] << ' ';
  cout << vec[vec.size() - 1] << '\n';
}
template <typename Arg>
void print(const Arg arg) {
  cout << arg << '\n';
}
template <typename Head, typename... Args>
void print(const Head head, const Args... args) {
  cout << head << " ";
  print(args...);
}
template <typename T, typename U>
void init(vector<T>& v, vector<U>& w) {
  for (long long i = (0); i <= static_cast<long long>(v.size() - 1); i++)
    cin >> v[i] >> w[i];
}
template <typename T>
void init(vector<T>& v) {
  for (long long i = (0); i <= static_cast<long long>(v.size() - 1); i++)
    cin >> v[i];
}
template <typename T>
T sum_(vector<T> vec, T init = 0) {
  return std::accumulate((vec).begin(), (vec).end(), T(init));
}
template <typename T>
bool chmax(T& a, const T& b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}
template <typename T>
bool chmin(T& a, const T& b) {
  if (a > b) {
    a = b;
    return true;
  }
  return false;
}
template <typename T>
long long index(const T& vec, const typename T::iterator it) {
  return oniance(vec.begin(), it);
}
template <typename T = long long>
mat<T> mmat(long long n, long long m = 0) {
  return mat<T>(n, vector<T>(m));
}
template <typename T = long long>
vector<T> ivec(long long n) {
  vector<T> v(n);
  init(v);
  return v;
}
void yn(bool tf) { print(tf ? "Yes" : "No"); }
void YN(bool tf) { print(tf ? "YES" : "NO"); }
long long gcd(long long a, long long b) { return b ? gcd(b, a % b) : a; }
vector<vector<long long>> tree;
vector<long long> oni;
vector<long long> tak;
void dfs(long long x, long long now) {
  for (auto& nex : (tree[x])) {
    if (oni[nex] == -1) {
      oni[nex] = now + 1;
      dfs(nex, now + 1);
    }
  }
  return;
}
void dfs2(long long x, long long now) {
  for (auto& nex : (tree[x])) {
    if (tak[nex] == -1 and now + 1 < oni[nex]) {
      tak[nex] = now + 1;
      dfs2(nex, now + 1);
    }
  }
  return;
}
signed main() {
  cin.tie(0), cout.tie(0), ios::sync_with_stdio(false);
  long long n, u, v;
  cin >> n >> u >> v;
  tree = mat<long long>(n + 1);
  oni = vector<long long>(n + 1, -1);
  tak = vector<long long>(n + 1, -1);
  long long a, b;
  for (long long i = (0); i <= static_cast<long long>(n - 1 - 1); i++) {
    cin >> a >> b;
    tree[a].push_back(b);
    tree[b].push_back(a);
  }
  oni[v] = 0;
  dfs(v, 0);
  tak[u] = 0;
  dfs2(u, 0);
  long long ans = 0;
  for (long long i = (0); i <= static_cast<long long>(n - 1); i++) {
    if (tak[i + 1] != 1 and tree[i + 1].size() == 1) {
      chmax(ans, oni[i + 1] - 1);
    }
  }
  print(ans);
  return 0;
}
