import kotlin.collections.ArrayDeque as ArrayDeque

@OptIn(ExperimentalStdlibApi::class)
fun main(args: Array<String>) {
    val inf = 1001001001
    val to = Array(100005) { mutableListOf<Int>() }

    var (n, m) = readLine()!!.split(" ").map { it.toInt() }
    repeat(m) {
        var (a, b) = readLine()!!.split(" ").map { it.toInt() }

        // inputが1始まりなので調整
        a--
        b--

        // 経路情報を格納
        to[a].add(b)
        to[b].add(a)
    }

    // キュー
    val q = ArrayDeque<Int>()
    // 距離(深さ)
    val dist = Array(n) { inf }
    // 親ノード
    val prev = Array(n) { -1 }

    dist[0] = 0
    q.addLast(0)

    while (q.isNotEmpty()) {
        // キューの先頭要素取得
        val v = q.first()
        q.removeFirst()

        // vから辿れる経路を評価していく
        for (u in to[v]) {
            if (dist[u] != inf) {
                // 設定済みなのでスキップ
                continue
            }

            // vから辿れる経路はv+1
            dist[u] = dist[v] + 1
            // 親ノードにvをセット
            prev[u] = v
            // キューへ追加
            q.addLast(u)
        }
    }

    // 制約；どの2部屋間も、通路をいくつか通って行き来できる
    // -> Noのケース無し
    println("Yes")
    
    for (i in 0 until n) {
        if (i == 0) {
            // 部屋1は出力対象外
            continue
        }

        // 親ノードが辿るべき部屋(0始まりに調整していたのを+1で戻す)
        val ans = prev[i] + 1
        println(ans)
    }
}