//package misc.ukiepc2025 fun main() { val (n, m) = readInts() val heights = readInts() val edges = List(m) { val (u, v) = readInts().map { it - 1 } Edge(u, v, maxOf(heights[u], heights[v])) }.sortedBy { it.hMax } var ans = Int.MAX_VALUE for (hLow in heights.sorted()) { if (hLow > heights[0] || hLow > heights[1]) break val dsu = DisjointSetUnion(n) for (e in edges) { val (u, v, hMax) = e if (heights[u] < hLow || heights[v] < hLow) continue if (dsu[u] == dsu[v]) continue dsu.unite(u, v) if (dsu[0] == dsu[1]) { ans = minOf(ans, hMax - hLow) break } } } println(ans) } data class Edge(val u: Int, val v: Int, val hMax: Int) class DisjointSetUnion(n: Int) { internal val p: IntArray = IntArray(n) { it } internal val r = java.util.Random(566) internal operator fun get(v: Int): Int = if (p[v] == v) v else { p[v] = get(p[v]); p[v] } internal fun unite(v: Int, u: Int) = if (r.nextBoolean()) p[get(v)] = get(u) else p[get(u)] = get(v) } private fun readStrings() = readln().split(" ") private fun readInts() = readStrings().map { it.toInt() }