//
//AtCoder Beginner Contest 168
//D - .. (Double Dots) 
//

#include <iostream>
#include <algorithm>
#include <vector>
#include <iomanip>
#include <cmath>
#include <ctime>
#include <queue>
#include <map>
#include <set>
#include <tuple>
#include <functional>
#include <cassert>

using namespace std;

#define REP(i,n) for(ll i=0;i<(ll)(n);i++)
#define REPD(i,n) for(ll i=n-1;i>=0;i--)
#define FOR(i,a,b) for(ll i=a;i<=(ll)(b);i++)
#define FORD(i,a,b) for(ll i=a;i>=(ll)(b);i--)
#define ALL(x) (x).begin(),(x).end()
#define RALL(x) (x).rbegin(),(x).rend()
#define SIZE(x) (int)(x).size()
#define SIZEL(x) (ll)(x).size()
#define MSG(a) cout << #a << " " << a << endl;

using ll = long long;
using ld = long double;

const double PI = 3.14159265358979323846;

ll gcd(ll x, ll y) { return (x % y)? gcd(y, x % y): y; }    //最大公約数
ll lcm(ll x, ll y) { return x / gcd(x, y) * y; }            //最小公倍数

using Graph = vector<vector<int>>;
vector<bool> seen;

int main()
{
    int n, m;

    cin >> n >> m;

    Graph G(n);
    REP(i, m){
        int a, b;
        cin >> a >> b;
        G[a-1].push_back(b-1);
        G[b-1].push_back(a-1);
    }

    // BFS のためのデータ構造
    vector<int> dist(n, -1);    // 全頂点を「未訪問」に初期化
    vector<int> guide(n, -1);   // 道標(前の頂点)
    vector<vector <int>> mem(n); // 全頂点を「未訪問」に初期化
    queue<int> que;

    // 初期条件 (頂点 0 を初期ノードとする)
    dist[0] = 0;
    guide[0] = 0;
    que.push(0);

    while (!que.empty()) {
        int v = que.front();
        que.pop();

        // v から辿れる頂点をすべて調べる
        for (int nv : G[v]) {
            if (dist[nv] != -1) continue;

            // 新たな白色頂点 nv について距離情報を更新してキューに追加する
            dist[nv] = dist[v] + 1;
            if (guide[nv] == -1) guide[nv]=v;

            que.push(nv);
        }
    }

    //for (int v = 0; v < n; ++v) cout << v << ": " << dist[v] << ":" << guide[v] << endl;

    string f = "Yes";
    FOR(i, 1, n-1){
        if (dist[i] == 0) f="No";
    }

    cout << f << endl;
    if (f=="Yes"){
        FOR(i, 1, n-1) cout << guide[i]+1 << endl;
    }

    return 0;
}
