#include <bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define ll long long
#ifdef LOCAL
#include "algo/debug.h"
#else
#define debug(...) 42
#endif
template <class T> bool ckmax(T &a, T b) { return a < b ? (a = b, true) : false; }
template <class T> bool ckmin(T &a, T b) { return a > b ? (a = b, true) : false; }
const int MAXN = 3e5 + 5;
int n, a, b;
vector<int> g[MAXN];
vector<int> path;
bool dfs(int u, int p) {
path.emplace_back(u);
if (u == b) return 1;
for (int v : g[u]) {
if (v != p && dfs(v, u)) return 1;
}
path.pop_back();
return 0;
}
ll calc(int u, int p, int ban) {
ll ans = 0;
vector<ll> s;
for (int v : g[u]) {
if (v != p && v != ban) {
ll val = calc(v, u, ban);
s.emplace_back(val);
}
}
sort(s.rbegin(), s.rend());
int cnt = 1;
for (ll val : s) {
ckmax(ans, val + cnt);
cnt++;
}
return ans;
}
ll cost(int x, int y) {
return max(calc(a, 0, y), calc(b, 0, x));
}
int main() {
#define NAME "test"
if (fopen(NAME".inp", "r")) {
freopen(NAME".inp", "r", stdin);
freopen(NAME".out", "w", stdout);
}
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n >> a >> b;
for (int i = 1; i < n; i++) {
int u, v; cin >> u >> v;
g[u].emplace_back(v);
g[v].emplace_back(u);
}
dfs(a, 0);
if (path.size() == 2) {
// debug(calc(a, 0, b));
cout << cost(a, b) << '\n';
return 0;
}
int l = 0, r = path.size() - 3, ans = 0;
while (l <= r) {
int mid = (l + r) >> 1;
if (cost(mid, mid + 1) < cost(mid + 1, mid + 2)) {
l = mid + 1, ans = mid;
} else r = mid - 1;
}
cout << min(cost(ans, ans + 1), cost(ans + 1, ans + 2)) << '\n';
return 0;
}