#include <stdio.h>//13433156参考
#define M 1000000//定義
int last[M], previousRoad[M], go[M], ans[M], visited[M], stack[M];

int i, n, m, x, y, flag = 0, re, t, l = 0, r = 1;
//nは部屋
//mは通路
int main(){
    scanf("%d%d", &n, &m);

    for (int i = 1; i <= m; i++)
    { //道を読み取る
        scanf("%d%d", &x, &y);
        previousRoad[i] = last[x];
        last[x] = i;//iこめの道
        go[i] = y;

        previousRoad[i + m] = last[y];
        last[y] = i + m;//i個目の道(数字がかぶらないように)
        go[i + m] = x;
    }

    stack[1] = 1;
    visited[1] = 1;//closedリスト的な
    while(l<r){
        l++;//今このふかさの層に存在するノードのうちlコメを調べている
        re = stack[l]; //qはスタックreは部屋番号

        t = last[re];//部屋１を最後に現れた道番号
        while(t){
            if(!visited[go[t]]){//go[t]でその道で行き着く部屋→訪れていない時のみ処理
                visited[go[t]] = 1;//ノード　（部屋）に訪れましたよ
                r++;//他の部屋があるよ
                stack[r] = go[t]; //で子供の部屋はここ
                ans[go[t]] = re; //部屋go[t]の親部屋はre
            }
            t = previousRoad[t];//この部屋が以前出現した別の道なければwhileを抜ける
        }
        //reへやに連なる子供を見おえた

    }
    for (i = 2; i <= n;i++){
        if(!visited[i])
            flag = 1;
    }
    if(flag)
        puts("No");
    else{
        puts("Yes");
        for (i = 2; i <= n; i++)
            printf("%d\n", ans[i]);
    }
}
