#include <bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define mp make_pair
#define pb push_back
typedef pair<int, int> ii;
const int len = 1e6+5, inf = 1e9;
vector<int> adj[len], cost[len], order;
int block[len], dp[2][len];
int fix_order(int u, int p, int en){
if (u == en){
block[u] = 1;
return 1;
}
for (auto v: adj[u]){
if (v == p) continue;
if (fix_order(v, u, en)){
order.pb(u);
block[u] = 1;
return 1;
}
}
return 0;
}
int run_dfs(int u, int p){
int mx1 = 0, mx2 = 0, kids = 0;
for (auto v: adj[u]){
if (v == p) continue;
kids++;
int cur = run_dfs(v, u);
if (cur > mx1)
mx2 = mx1, mx1 = cur;
else if (cur > mx2)
mx2 = cur;
}
return mx2+kids;
}
int main(){
int n, en, st;
scanf("%d %d %d", &n, &en, &st);
for (int i = 0; i < n-1; i++){
int a, b;
scanf("%d %d", &a, &b);
adj[a].pb(b);
adj[b].pb(a);
}
fix_order(st, st, en);
reverse(order.begin(), order.end());
for (int i = (int)order.size()-1, cnt = 0; i >= 0; i--){
int u = order[i];
//printf("i = %d, u = %d\n", i, u);
for (auto v: adj[u]){
if (block[v]) continue;
cost[i].pb(run_dfs(v, u)+1);
//printf("%d -> %d, cost = %d\n", u, v, cost[i].back());
}
sort(cost[i].begin(), cost[i].end());
reverse(cost[i].begin(), cost[i].end());
for (int j = (int)cost[i].size()-1; j >= 0; j--)
cost[i][j] += cnt++;
}
for (int i = (int)order.size()-1; i >= 0; i--){
for (int rem = 1; rem <= i+1; rem++){
dp[i&1][rem] = inf;
if (rem >= cost[i].size())
dp[i&1][rem] = cost[i].size() + dp[(i+1)&1][rem-cost[i].size()+1];
for (int j = 0; j < cost[i].size(); j++){
if (j <= rem)
dp[i&1][rem] = min(dp[i&1][rem], j+max(cost[i][j], dp[(i+1)&1][rem-j+1]));
}
}
}
printf("%d\n", dp[0][1]);
return 0;
}