#include <iostream>
#include <vector>
using namespace std;
using Graph = vector<vector<int>>;
int ud[100001];
int vd[100001];
// 深さ優先探索
vector<bool> seen;
void udfs(const Graph &G, int v , int l) {
  //cout << v << endl;
    seen[v] = true; // v を訪問済にする
    ud[v] = l;
    // v から行ける各頂点 next_v について
    for (auto next_v : G[v]) { 
        if (seen[next_v]) continue; // next_v が探索済だったらスルー
        udfs(G, next_v , l+1); // 再帰的に探索
    }
}
void vdfs(const Graph &G, int v , int l) {
  //cout << v << endl;
    seen[v] = true; // v を訪問済にする
    vd[v] = l;
    // v から行ける各頂点 next_v について
    for (auto next_v : G[v]) { 
        if (seen[next_v]) continue; // next_v が探索済だったらスルー
        vdfs(G, next_v , l+1); // 再帰的に探索
    }
}

int main() {
    // 頂点数と辺数
    int N; cin >> N;
  int u,v;
  cin >> u >> v;
  if(u==v){cout << 0 << end;return 0;}
//cout << N << endl;
    // グラフ入力受取 (ここでは無向グラフを想定)
    Graph G(N+1);
  //cout << N << endl;
    for (int i = 0; i < N; ++i) {
        int a, b;
        cin >> a >> b;
        G[a].push_back(b);
        G[b].push_back(a);
    }
  

    // 頂点 0 をスタートとした探索
    seen.assign(N+1, false); // 全頂点を「未訪問」に初期化
    udfs(G,u,0);
  seen.assign(N+1,false);
  vdfs(G,v,0);
 int  ans = 0;
  for(int i=0; i<N; i++){
    if(ud[i+1]<vd[i+1]){
    ans = max(ans,vd[i+1]);
    }
  }
  cout << ans-1 << endl;
 
                           
                           
                        
  
}