const int MAXN=5e5+5,MAXM=20;
struct Edge{
int to,next;
}edge[MAXN<<1];
int head[MAXN],edge_cnt;
void Insert(int u,int v){
edge[++edge_cnt]=Edge{v,head[u]};
head[u]=edge_cnt;
}
int p[MAXN];
multiset<int> dp[MAXN];
void dfs(int u,int fa){
dp[u].insert(1);
p[u]=fa;
for(int i=head[u];i;i=edge[i].next){
int v=edge[i].to;
if(v==fa)continue;
dfs(v,u);
dp[u].insert(*dp[v].rbegin()+1);
}
}
struct ST{
int d[MAXN][MAXM],lg2[MAXN];
void build(int *a,int n){
lg2[1]=0;
_rep(i,2,n)
lg2[i]=lg2[i>>1]+1;
_for(i,0,n)
d[i][0]=a[i];
for(int j=1;(1<<j)<=n;j++){
_for(i,0,n+1-(1<<j))
d[i][j]=max(d[i][j-1],d[i+(1<<(j-1))][j-1]);
}
}
int query(int lef,int rig){
int len=rig-lef+1;
return max(d[lef][lg2[len]],d[rig-(1<<lg2[len])+1][lg2[len]]);
}
}st1,st2;
int mv1[MAXN],mv2[MAXN];
int solve(int l,int r,int pos){
if(l+1==r)
return mv1[l]-mv2[r];
if(pos==0)
return max(mv1[l]-st2.query(l+1,r),solve(l+1,r,!pos));
else
return min(st1.query(l,r-1)-mv2[r],solve(l,r-1,!pos));
}
int main(){
int n=read_int(),s=read_int(),t=read_int();
_for(i,1,n){
int u=read_int(),v=read_int();
Insert(u,v);
Insert(v,u);
}
dfs(s,0);
vector<int> vec;
int pos=t;
while(pos){
vec.push_back(pos);
pos=p[pos];
}
reverse(vec.begin(),vec.end());
_for(i,0,vec.size()){
int v=vec[i];
if(i!=vec.size()-1){
int v2=vec[i+1];
dp[v].erase(dp[v].find(*dp[v2].rbegin()+1));
}
}
_for(i,0,vec.size()){
mv1[i]=*dp[vec[i]].rbegin()+i;
mv2[i]=*dp[vec[i]].rbegin()+vec.size()-i-1;
}
st1.build(mv1,vec.size());
st2.build(mv2,vec.size());
enter(solve(0,vec.size()-1,0));
return 0;
}