#pragma region Macros
#include <bits/stdc++.h>
using namespace std;
#define REP(i, n) for(int i=0, i##_len=(n); i<i##_len; ++i)
#define REPR(i, n) for(int i=(n); i>=0; --i)
#define FOR(i, n, m) for(int i=(m), i##_len=(n); i<i##_len; ++i)
#define EACH(i, v) for(const auto& i : v)
#define ALL(x) (x).begin(),(x).end()
#define ALLR(x) (x).rbegin(),(x).rend()
template<class T>bool chmax(T &a, const T &b) { if (a<b) { a=b; return 1; } return 0; }
template<class T>bool chmin(T &a, const T &b) { if (b<a) { a=b; return 1; } return 0; }
template<class Value>using vec = vector< Value >;
using ll = long long;
using P = pair< long long, long long >;
#define fi first
#define se second
#define el endl
#pragma endregion

const string YES = "Yes";

void Main();
void solve(long long N, long long M, std::vector<long long> A, std::vector<long long> B);

int main(){
    std::cin.tie(nullptr);
    std::cout << std::fixed << std::setprecision(15);
    Main();
    return 0;
}

void Main(){
    long long N;
    scanf("%lld",&N);
    long long M;
    scanf("%lld",&M);
    std::vector<long long> A(M);
    std::vector<long long> B(M);
    for(int i = 0 ; i < M ; i++){
        scanf("%lld",&A[i]);
        scanf("%lld",&B[i]);
    }
    solve(N, M, std::move(A), std::move(B));
}

#pragma region bfs
#define BFSMAP vector<vector<BFSOBJ> >
struct BFSOBJ{
    ll x;
    ll y;
    vector<BFSOBJ*> next;
    bool is(const BFSOBJ* obj){
        return x==obj->x&&y==obj->y;
    }
    void set4(BFSMAP& ob, int i=-1, int j=-1){
        if(j<0||i<0){
            i=x;
            j=y;
        }
        int H=ob.size();
        int W=ob[0].size();
        if(i-1>=0) next.push_back(&ob[i-1][j]);
        if(j-1>=0) next.push_back(&ob[i][j-1]);
        if(i+1<H) next.push_back(&ob[i+1][j]);
        if(j+1<W) next.push_back(&ob[i][j+1]);
    }
    void set8(BFSMAP& ob, int i=-1, int j=-1){
        if(j<0||i<0){
            i=x;
            j=y;
        }
        int H=ob.size();
        int W=ob[0].size();
        bool n1, n2, n3, n4;
        if(n1=i-1>=0) next.push_back(&ob[i-1][j]);
        if(n2=j-1>=0) next.push_back(&ob[i][j-1]);
        if(n3=i+1<H) next.push_back(&ob[i+1][j]);
        if(n4=j+1<W) next.push_back(&ob[i][j+1]);
        if(n1&&n2) next.push_back(&ob[i-1][j-1]);
        if(n2&&n3) next.push_back(&ob[i+1][j-1]);
        if(n3&&n4) next.push_back(&ob[i+1][j+1]);
        if(n4&&n1) next.push_back(&ob[i-1][j+1]);
    }
};

vec<ll> coun;
map<BFSOBJ*, int> bfs(BFSOBJ* start, BFSOBJ* end){
    queue<BFSOBJ*> q;
    map<BFSOBJ*, int> depth;
    q.push(start);
    depth[start] = 0;
    while(!q.empty()){
        BFSOBJ* now = q.front(); q.pop();
        for(const auto& next : now->next){
            if(depth.end() == depth.find(next)){
                depth[next] = depth[now] + 1;
                coun[next->x] = now->x;
                q.push(next);
            }
        }
    }
    return depth;
}
#pragma endregion

void solve(long long N, long long M, std::vector<long long> A, std::vector<long long> B){
    vec<BFSOBJ> G(N);
    coun.resize(N+10);
    fill(ALL(coun), -1);
    REP(i, M){
        A[i]--;B[i]--;
        G[A[i]].x = A[i];
        G[B[i]].x = B[i];
        G[A[i]].next.push_back(&G[B[i]]);
        G[B[i]].next.push_back(&G[A[i]]);
    }
    bfs(&G[0], nullptr);
    FOR(i, N, 1){
        if(coun[i] == -1){
            cout << "No\n";return;
        }
    }
    cout << "Yes\n";
    FOR(i, N, 1){
        cout << coun[i]+1 << el;
    }
}



Measured memory_bytes: 23912