#include<iostream>
#include<vector>
using namespace std;
vector<vector<int>> c(100100,vector<int> (0));
int N;

//既に探索した部分をboolの配列で表現したところREとなった
//上記boolをやめて，一つ前のpositionをppで把握→ppを飛ばすとしても提出結果に変わりなし
//入力のN数に対して，用意していたcの配列の数が小さ過ぎました！凡ミス！
void DFS(int p,int ans,int pp,vector<int> &d){
  d.at(p)=ans;
  for(int i:c.at(p)){
    if(i==pp){continue;}
    DFS(i,ans+1,p,d);
  }
  return;
}

vector<int> dist(int p){
  vector<int> d(N);
  DFS(p,0,-1,d);
  return d;
}

int main(){
  int T,A,ans=0;
  
  cin>>N>>T>>A;
  T--;A--;
  
  int s,t;
  for(int i=0;i<N-1;i++){
    cin>>s>>t;
    s--;t--;
    c.at(s).push_back(t);
    c.at(t).push_back(s);
  }
  
  vector<int> Td(N),Ad(N);
  Td=dist(T);
  Ad=dist(A);
  
  for(int i=0;i<N;i++){
    if(Td[i]<Ad[i]){ans=max(ans,Ad[i]-1);}
  }
  cout<<ans;
}