// Original C++ solution (slower):
#include "bits/stdc++.h"

#define rep(i, j) for (int i = 0; i < j; i++)

using namespace std;

using ll = long long;



const int INF = 1001001001;



/*struct mint {

    ll x; // typedef long long ll;

    mint(ll x = 0) :x((x% mod + mod) % mod) {}

    mint operator-() const { return mint(-x); }

    mint& operator+=(const mint a) {

        if ((x += a.x) >= mod) x -= mod;

        return *this;

    }

    mint& operator-=(const mint a) {

        if ((x += mod - a.x) >= mod) x -= mod;

        return *this;

    }

    mint& operator*=(const mint a) { (x *= a.x) %= mod; return *this; }

    mint operator+(const mint a) const { return mint(*this) += a; }

    mint operator-(const mint a) const { return mint(*this) -= a; }

    mint operator*(const mint a) const { return mint(*this) *= a; }

    mint pow(ll t) const {

        if (!t) return 1;

        mint a = pow(t >> 1);

        a *= a;

        if (t & 1) a *= *this;

        return a;

    }



    // for prime mod

    mint inv() const { return pow(mod - 2); }

    mint& operator/=(const mint a) { return *this *= a.inv(); }

    mint operator/(const mint a) const { return mint(*this) /= a; }

};

istream& operator>>(istream & is, const mint & a) { return is >> a.x; }

ostream& operator<<(ostream & os, const mint & a) { return os << a.x; }*/



vector<int> to[100005];



int main() {

    int n, m;

    cin >> n >> m;

    rep(i, m) {

        int a, b;

        cin >> a >> b;

        a--; b--;

        to[a].emplace_back(b);

        to[b].emplace_back(a);

    }

    

    queue<int> q;

    vector<int> dist(n, INF);

    vector<int> pre(n, -1);

    dist[0] = 0;

    q.push(0);

    while (!q.empty()) {

        int v = q.front(); q.pop();

        for (int u : to[v]) {

            if (dist[u] != INF) continue;

            dist[u] = dist[v] + 1;

            pre[u] = v;

            q.push(u);

        }

    }



    cout << "Yes" << endl;

    rep(i, n) {

        if (i == 0) continue;

        int ans = pre[i];

        ans++;

        cout << ans << endl;

    }

    return 0;

}


// Optimized solution to the same problem (faster):
#include "bits/stdc++.h"

#define rep(i, j) for (int i = 0; i < j; i++)

using namespace std;

using ll = long long;

using ull = unsigned long long;



int gcd(int x, int y);



const int INF = 1001001001;



//mint�p�̕ϐ� (10��9��)

const int mod = 1000000007;



struct mint {

    ll x; // typedef long long ll;

    mint(ll x = 0) :x((x% mod + mod) % mod) {}

    mint operator-() const { return mint(-x); }

    mint& operator+=(const mint a) {

        if ((x += a.x) >= mod) x -= mod;

        return *this;

    }

    mint& operator-=(const mint a) {

        if ((x += mod - a.x) >= mod) x -= mod;

        return *this;

    }

    mint& operator*=(const mint a) { (x *= a.x) %= mod; return *this; }

    mint operator+(const mint a) const { return mint(*this) += a; }

    mint operator-(const mint a) const { return mint(*this) -= a; }

    mint operator*(const mint a) const { return mint(*this) *= a; }

    mint pow(ll t) const {

        if (!t) return 1;

        mint a = pow(t >> 1);

        a *= a;

        if (t & 1) a *= *this;

        return a;

    }



    // for prime mod

    mint inv() const { return pow(mod - 2); }

    mint& operator/=(const mint a) { return *this *= a.inv(); }

    mint operator/(const mint a) const { return mint(*this) /= a; }

};

istream& operator>>(istream & is, const mint & a) { return is >> a.x; }

ostream& operator<<(ostream & os, const mint & a) { return os << a.x; }





int main() {

    int n, m;

    cin >> n >> m;

    vector<vector<int> > rouka(n, vector<int>(0));

    vector<int> flag(n, -1);

    rep(i, m) {

        int num1, num2;

        cin >> num1 >> num2;

        rouka[num1 - 1].emplace_back(num2 - 1);

        rouka[num2 - 1].emplace_back(num1 - 1);

    }

    queue<int> v;

    vector<int> pre(n, -1);

    v.push(0);

    while (!v.empty()) {

        int j = v.front();

        v.pop();

        //i = �ڑ���̕��� v = �T�����ɕ��񂾔z��

        //�͈�for��j�̕����ƂȂ����Ă��镔��������

        //j = ���Ƃ̂ւ�(�O���t�؂ł����e�m�[�h)

        for (int i : rouka[j]) {

            if (flag[i] != -1) continue; //���łɂ݂��Ă���Ȃ��΂�

            flag[i] = flag[j] + 1; //���܂�����}�[�N

            pre[i] = j; //i�Ԗڂ̕�����j�Ԗڂ̕����Ɍ�������1�ɂ�����

            v.push(i); //i���ς�悤�ɂ���

        }

    }



    cout << "Yes" << endl;

    rep(i, n) {

        if (i == 0) continue;

        cout << pre[i] + 1 << endl;

    }

    return 0;

}

/*���C�u�����ő����*/

//���[�O���b�h�̌ݏ��@

int gcd(int x, int y) {

    int num[3];

    num[0] = (x > y) ? x : y;

    num[1] = (x <= y) ? x : y;

    num[2] = num[0] % num[1];



    while (num[2]) {

        num[0] = num[1];

        num[1] = num[2];

        num[2] = num[0] % num[1];

    }



    return num[1];

}

// Fastest known solution for this problem: