#include <bits/stdc++.h>
int acs(const void *a, const void *b) { return *(int *)a - *(int *)b; }
int des(const void *a, const void *b) { return *(int *)b - *(int *)a; }
int cmp_char(const void *a, const void *b) { return *(char *)a - *(char *)b; }
int cmp_str(const void *a, const void *b) {
  return strcmp(*(const char **)a, *(const char **)b);
}
typedef struct {
  int front;
  int rear;
  int data[100001][2];
} queue;
queue que;
void initQueue(queue *p) { p->front = p->rear = 0; }
bool emptyQueue(queue *p) { return p->front == p->rear; }
bool fullQueue(queue *p) {
  return (p->front - 1 == p->rear) || (p->front == 0 && p->rear == 100001 - 1);
}
void queuePop(queue *p) {
  if (emptyQueue(p)) {
    printf("UnderFlow\n");
    exit(1);
  } else {
    p->front++;
    if (p->front == 100001) p->front = 0;
  }
}
void queuePush(queue *p, int node, int parent) {
  if (fullQueue(p)) {
    printf("OverFlow\n");
    exit(1);
  } else {
    p->data[p->rear][0] = node;
    p->data[p->rear][1] = parent;
    p->rear++;
    if (p->rear == 100001) p->rear = 0;
  }
}
typedef struct list {
  int node;
  struct list *next;
} list;
list *graph[100001];
void initGraph(void) {
  for (int i = 0; i < 100001; i++) graph[i] = NULL;
}
void addEdge(int node1, int node2) {
  list *new1 = (list *)malloc(sizeof(list *));
  new1->node = node2;
  new1->next = graph[node1];
  graph[node1] = new1;
  list *new2 = (list *)malloc(sizeof(list *));
  new2->node = node1;
  new2->next = graph[node2];
  graph[node2] = new2;
}
int main(void) {
  int N, u, v, a, b;
  scanf("%d %d %d", &N, &u, &v);
  initGraph();
  for (int i = 0; i < N; i++) {
    scanf("%d %d", &a, &b);
    addEdge(a, b);
  }
  int aoki[100001];
  queue ki;
  initQueue(&ki);
  queuePush(&ki, v, 0);
  aoki[v] = 0;
  while (!emptyQueue(&ki)) {
    int n = ki.data[ki.front][0];
    int p = ki.data[ki.front][1];
    queuePop(&ki);
    aoki[n] = aoki[p] + 1;
    int count = 0;
    for (list *c = graph[n]; c != NULL; c = c->next) {
      if (c->node == p) continue;
      queuePush(&ki, c->node, n);
      count++;
    }
    if (count == 0) aoki[n] = 0;
  }
  int taka[100001];
  initQueue(&ki);
  queuePush(&ki, u, 0);
  taka[u] = 0;
  while (!emptyQueue(&ki)) {
    int n = ki.data[ki.front][0];
    int p = ki.data[ki.front][1];
    queuePop(&ki);
    taka[n] = taka[p] + 1;
    for (list *c = graph[n]; c != NULL; c = c->next) {
      if (c->node == p) continue;
      queuePush(&ki, c->node, n);
    }
  }
  int ans = 0;
  for (int node = 1; node < N + 1; node++) {
    if (taka[node] > aoki[node]) continue;
    ans = (ans > aoki[node] ? ans : aoki[node]);
  }
  printf("%d\n", ans);
  return 0;
}
