import java.util.*

class State(val pos: Int, val cost: Int)

fun main(args: Array<String>) {
    val sc = Scanner(System.`in`)

    val n = sc.nextInt()
    val u = sc.nextInt() - 1
    val v = sc.nextInt() - 1

    val g = Array(n) { mutableListOf<Int>() }

    repeat(n - 1) {
        val a = sc.nextInt() - 1
        val b = sc.nextInt() - 1
        g[a].add(b)
        g[b].add(a)
    }

    // 青木くんからの最短距離を出す
    val aokiCost = IntArray(n) { -1 }
    val aokiQue = LinkedList<State>()
    aokiQue.add(State(v, 0))
    aokiCost[v] = 0
    while (aokiQue.isNotEmpty()) {
        val st = aokiQue.poll()
        for (to in g[st.pos]) {
            if (aokiCost[to] == -1) {
                aokiCost[to] = st.cost + 1
                aokiQue.add(State(to, st.cost + 1))
            }
        }
    }

    // 高橋くんが出発してから青木くんより早く到達できるノードにだけ進む
    var ans = 0
    val takaCost = IntArray(n) { -1 }
    val takaQue = LinkedList<State>()
    takaQue.add(State(u, 0))
    takaCost[u] = 0
    while (takaQue.isNotEmpty()) {
        val st = takaQue.poll()
        val nextCost = st.cost + 1
        for (to in g[st.pos]) {
            if (takaCost[to] == -1 && nextCost < aokiCost[to]) {
                takaCost[to] = nextCost
                takaQue.add(State(to, nextCost))
                ans = Math.max(ans, nextCost)
            } else if (nextCost == aokiCost[to]) {
                // ちょうど青木くんと同じタイミングで踏んでしまう場合
                ans = Math.max(ans, nextCost)
            }
        }
    }

    println(ans)
}