#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
using namespace std;
template <class T>
inline bool chmax(T& a, T b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T>
inline bool chmin(T& a, T b) {
  if (a > b) {
    a = b;
    return 1;
  }
  return 0;
}
struct io {
  io() {
    ios::sync_with_stdio(false);
    cin.tie(0);
  }
};
const long long int MOD = 1000000007;
const double EPS = 1e-9;
const int INF = INT_MAX;
const long long int LLINF = 1LL << 60;
class DIJKSTRA {
 public:
  int V;
  struct dk_edge {
    int to;
    int cost;
  };
  typedef pair<int, int> PI;
  vector<vector<dk_edge> > G;
  vector<int> d;
  vector<int> prev;
  DIJKSTRA(int size) {
    V = size;
    G = vector<vector<dk_edge> >(V);
    prev = vector<int>(V, -1);
  }
  void add(int from, int to, int cost) {
    dk_edge e = {to, cost};
    G[from].push_back(e);
  }
  void dijkstra(int s) {
    priority_queue<PI, vector<PI>, greater<PI> > que;
    d = vector<int>(V, INF);
    d[s] = 0;
    que.push(PI(0, s));
    while (!que.empty()) {
      PI p = que.top();
      que.pop();
      int v = p.second;
      if (d[v] < p.first) continue;
      for (int i = 0; i < G[v].size(); i++) {
        dk_edge e = G[v][i];
        if (d[e.to] > d[v] + e.cost) {
          d[e.to] = d[v] + e.cost;
          prev[e.to] = v;
          que.push(PI(d[e.to], e.to));
        }
      }
    }
  }
  vector<int> get_path(int t) {
    vector<int> path;
    for (; t != -1; t = prev[t]) {
      path.push_back(t);
    }
    reverse(path.begin(), path.end());
    return path;
  }
  void show() {
    for (int i = 0; i < d.size() - 1; i++) {
      cout << d[i] << " ";
    }
    cout << d[d.size() - 1] << endl;
  }
};
int main(void) {
  int n, a, b;
  scanf("%d %d %d", &n, &a, &b);
  a--;
  b--;
  int l, r;
  DIJKSTRA dk(n);
  for (int i = 0; i < (n - 1); ++i) {
    scanf("%d %d", &l, &r);
    l--;
    r--;
    dk.add(l, r, 1);
    dk.add(r, l, 1);
    dk.dijkstra(a);
  }
  vector<int> v = dk.get_path(b);
  if (v.size() % 2 == 0) {
    r = v.size() / 2;
    l = r - 1;
  } else {
    int mid = v.size() / 2;
    r = mid + 1;
    l = mid - 1;
  }
  int ans = 0;
  ans += (int)v.size() - r - 1;
  bool tuen = 0;
  int efrom = v[l], eto = v[l + 1];
  for (int i = 0; i < (dk.G[efrom].size()); ++i) {
    if (dk.G[efrom][i].to == eto) {
      dk.G[efrom].erase(dk.G[efrom].begin() + i);
      break;
    }
  }
  dk.dijkstra(efrom);
  int maxlen = 0;
  for (int i = 0; i < (dk.d.size()); ++i) {
    if (dk.d[i] != INF) maxlen = max(maxlen, dk.d[i]);
  }
  cout << (maxlen + ans + (r - l - 1)) << '\n';
}
