using System;
using System.Numerics;
using System.Linq;
using System.Collections.Generic;
using System.Text;
using System.Collections;
namespace debug
{
class main
{
static void Main(string args)
{
//問題クラスを展開
ProgramD a = new ProgramD();
a.main();//実行する
}
}
class ProgramA
{
public void main()
{
//入力
string s = Console.ReadLine();
//1の位の数を出す
int one = s[s.Length - 1] - '0';
//それぞれ条件分岐
if (one == 3)
Console.WriteLine("bon");
else if(one ==0 || one == 1 || one == 6|| one== 8)
Console.WriteLine("pon");
else
Console.WriteLine("hon");
}
}
class ProgramB
{
public void main()
{
//入力
int n = int.Parse(Console.ReadLine());
string s = Console.ReadLine();
//文字数がn以下ならそのまま出力で終わり
if (s.Length <= n)
{
Console.WriteLine(s);
return;
}
//それ以上ならn文字目まで出力する
for(int i = 0;i < n;i++)
Console.Write(s[i]);
//最後に...をつける
Console.Write("...");
}
}
class ProgramC
{
public void main()
{
//入力
string s = Console.ReadLine().Split(' ');
int a = int.Parse(s[0]);
int b = int.Parse(s[1]);
int h = int.Parse(s[2]);
int m = int.Parse(s[3]);
//分針と時針の12時からの角度を出す
double deg_h = (h / 12.0 + m / 720.0) * 2.0 * Math.PI;
double deg_m = m / 60.0 * 2.0 * Math.PI;
//余弦定理で求める
Console.WriteLine(Math.Sqrt(a*a + b*b - 2 * a*b*Math.Cos(Math.Abs(deg_h -deg_m))));
}
}
class ProgramD
{
public void main()
{
//入力
string s = Console.ReadLine().Split(' ');
int n = int.Parse(s[0]);
int m = int.Parse(s[1]);
//これらはインスタンスが作られていないのであらかじめ作る
List<int> test = new List<int>[100000];
//インスタンスを入れる
for (int i = 0; i < 100000; i++)
test[i] = new List<int>();
//リストを入れておく
for (int i = 0; i < m; i++)
{
string t = Console.ReadLine().Split(' ');
int a = int.Parse(t[0]);
int b = int.Parse(t[1]);
test[a - 1].Add(b - 1);
test[b - 1].Add(a - 1);
}
Queue<int> q = new Queue<int>();
int ans = new int[n - 1];
//最初のキューを入れておく
for (int j = 0; j < test[0].Count(); j++)
{
q.Enqueue(test[0][j]);
ans[test[0][j] - 1] = 1;
}
//全経路探るまで続ける
while (q.Count != 0)
{
//次の推移の候補場所を出す
for(int i = 0; i < q.Count;i++)
{
int k = q.Dequeue();
//次の候補場所が未検索であればキューに入れておく
for (int j = 0; j < test[k].Count(); j++)
{
//1に戻る場合は飛ばす(相互関係によって起こるのでそれを防ぐ)
if (test[k][j] == 0)
continue;
//もし未検索ならキューを入れる
if (ans[test[k][j] - 1] == 0)
{
q.Enqueue(test[k][j]);
ans[test[k][j] - 1] = k + 1;//添え字に注意(ans内は2からなのでもう1引く、kは1引いた状態なので1足して戻す
}
}
}
}
//あり得ないケースはないので、yesして答を出す
Console.WriteLine("Yes");
for (int i = 0; i < n - 1; i++)
Console.WriteLine(ans[i]);
}
}
}