#include <bits/stdc++.h>
using namespace std;
#define int long long
#define rep(i,a,b) for (int i = a; i <= b; i++)
#define per(i,a,b) for (int i = a; i >= b; i--)
#define pii pair<int,int>
#define fi first
#define se second
#define endl '\n'
#define pb push_back
#define all(v) (v).begin(), (v).end()
const int MAXN = 1e6+10;
const int INF = 1e18+10;
const int MOD = 1e9+7;
vector<int> g[MAXN];
int dp[MAXN], par[MAXN], dep[MAXN], w[MAXN], tin[MAXN], tout[MAXN], tempo;
bool isch(int x, int y) { return tin[x] >= tin[y] && tout[x] <= tout[y]; }
void dfs(int u, int p = 0) {
vector<int> ls={0};
tin[u] = ++tempo;
for(int &v : g[u])if(v!=p) {
if(p!=-1) w[v] = g[u].size()+w[u]-2;
dep[v] = dep[u] + 1;
dfs(v,u);
ls.pb(dp[v]);
}
tout[u] = ++tempo;
par[u] = p;
sort(ls.rbegin(), ls.rend());
if(ls.size()>1)dp[u] = ls[1]+ls.size()-1;
}
void solve() {
int n,m,t; cin >> n >> t >> m;
if(m==t) {
cout << "0" << endl;
return;
}
rep(i,1,n-1) {
int u,v; cin >> u >> v;
g[u].pb(v);
g[v].pb(u);
}
dfs(t);
rep(i,1,n) w[i] += dp[i];
int lo = w[m]+1, hi = 2*n, res = w[m];
vector<pii> side;
rep(i,1,n) {
if(isch(m,i) || par[i] == m || i == t || par[i] == t) continue;
if(isch(m,par[i])) {
side.pb({dep[m] - dep[par[i]], w[i]});
}
}
sort(all(side));
while (lo <= hi) {
int mid = (lo+hi)>>1;
int lst = -1, cur = 0, bl = 0;
bool ok = 1;
for(auto &[dist, W] : side) {
if(dist!=lst) {
lst = dist;
bl++;
}
if(W+cur > mid) {
if(bl==0) {
ok = 0;
break;
}
bl--;
cur++;
}
}
if(ok) {
res = mid;
hi = mid-1;
} else {
lo = mid+1;
}
}
cout << res << endl;
}
int32_t main() {
ios_base::sync_with_stdio(0);cin.tie(nullptr);
int tt = 1;
//cin >> tt;
while(tt--) solve();
}