import queue

N,M=list(map(int,input().split()))

adj=[[] for i in range(N+1)]

parent=[-1] * (N+1)

for m in range(M):

    a,b=list(map(int,input().split()))

    adj[a].append(b)

    adj[b].append(a)

q=queue.Queue()

q.put((1,0))

while(not q.empty()):

    x,p=q.get()

    if parent[x]!=-1:

        continue

    parent[x]=p

    for next in adj[x]:

        if parent[next]==-1:

            q.put((next,x))

print('Yes')

for p in parent[2:]:

    print(p)
import queue

N,M = list(map(int,input().split()))

adj = [[]for i in range(N+1)] #どこの部屋とどこの部屋が繋がっているかを表す、N＋1の理由は、部屋番号とインデックスが一個ずれてるから

parent = [-1] * (N+1) #-1なら未訪問、N+1な理由は同様である

for m in range(M):

    a,b = list(map(int,input().split()))

    adj[a].append(b) #お互いの場所を書く、繋がっているかを記録する

    adj[b].append(a) #こっちにもお互いの場所を書く

q = queue.Queue() #記録するようのトンネルみたいなもの、入ったものから出ていく感じ、自分の部屋番号、親の部屋番号（ただ作っただけ）

q.put((1,0)) # 部屋1の親は部屋0と考える（二個ぶち込んでる) 

while(not q.empty()): #もう探索の候補がqueueに入ってこなくなったら終わり

    x, p = q.get() #探索の候補を受け取る、一回取り出したらもう抜ける

    if parent[x] != -1: #-1じゃなくて変えられていたら訪問済みでスキップ

        continue

    parent[x] = p #親を示しているリストを更新する

    for next in adj[x]: #今いる場所に繋がっている部屋を全てループする

        if parent[next] == -1: # 未訪問なら

            q.put((next,x)) # 探索候補に追加、これがもう全て-1じゃなくて回りきったら終わりとする

print ('Yes') # 必ず目標は達成できる

for p in parent[2:]: # 部屋2以降の親（前の部屋）

    print(p)
import queue

N, M = list(map(int, input().split()))
adj = [[] for i in range(N + 1)]
parent = [-1] * (N + 1)
for m in range(M):
    a, b = list(map(int, input().split()))
    adj[a].append(b)
    adj[b].append(a)
q = queue.Queue()
q.put((1, 0))
while not q.empty():
    x, p = q.get()
    if parent[x] != -1:
        continue
    parent[x] = p
    for next in adj[x]:
        if parent[next] == -1:
            q.put((next, x))
print("Yes")
for p in parent[2:]:
    print(p)

import queue

N, M = list(map(int, input().split()))
adj = [[] for i in range(N + 1)]  # どこの部屋とどこの部屋が繋がっているかを表す、N＋1の理由は、部屋番号とインデックスが一個ずれてるから
parent = [-1] * (N + 1)  # -1なら未訪問、N+1な理由は同様である
for m in range(M):
    a, b = list(map(int, input().split()))
    adj[a].append(b)  # お互いの場所を書く、繋がっているかを記録する
    adj[b].append(a)  # こっちにもお互いの場所を書く
q = queue.Queue()  # 記録するようのトンネルみたいなもの、入ったものから出ていく感じ、自分の部屋番号、親の部屋番号（ただ作っただけ）
q.put((1, 0))  # 部屋1の親は部屋0と考える（二個ぶち込んでる)
while not q.empty():  # もう探索の候補がqueueに入ってこなくなったら終わり
    x, p = q.get()  # 探索の候補を受け取る、一回取り出したらもう抜ける
    if parent[x] != -1:  # -1じゃなくて変えられていたら訪問済みでスキップ
        continue
    parent[x] = p  # 親を示しているリストを更新する
    for next in adj[x]:  # 今いる場所に繋がっている部屋を全てループする
        if parent[next] == -1:  # 未訪問なら
            q.put((next, x))  # 探索候補に追加、これがもう全て-1じゃなくて回りきったら終わりとする
print("Yes")  # 必ず目標は達成できる
for p in parent[2:]:  # 部屋2以降の親（前の部屋）
    print(p)

-adj = [[] for i in range(N + 1)] -parent = [-1] * (N + 1) +adj = [[] for i in range(N + 1)]  # どこの部屋とどこの部屋が繋がっているかを表す、N＋1の理由は、部屋番号とインデックスが一個ずれてるから +parent = [-1] * (N + 1)  # -1なら未訪問、N+1な理由は同様である -    adj[a].append(b) -    adj[b].append(a) -q = queue.Queue() -q.put((1, 0)) -while not q.empty(): -    x, p = q.get() -    if parent[x] != -1: +    adj[a].append(b)  # お互いの場所を書く、繋がっているかを記録する +    adj[b].append(a)  # こっちにもお互いの場所を書く +q = queue.Queue()  # 記録するようのトンネルみたいなもの、入ったものから出ていく感じ、自分の部屋番号、親の部屋番号（ただ作っただけ） +q.put((1, 0))  # 部屋1の親は部屋0と考える（二個ぶち込んでる) +while not q.empty():  # もう探索の候補がqueueに入ってこなくなったら終わり +    x, p = q.get()  # 探索の候補を受け取る、一回取り出したらもう抜ける +    if parent[x] != -1:  # -1じゃなくて変えられていたら訪問済みでスキップ -    parent[x] = p -    for next in adj[x]: -        if parent[next] == -1: -            q.put((next, x)) -print("Yes") -for p in parent[2:]: +    parent[x] = p  # 親を示しているリストを更新する +    for next in adj[x]:  # 今いる場所に繋がっている部屋を全てループする +        if parent[next] == -1:  # 未訪問なら +            q.put((next, x))  # 探索候補に追加、これがもう全て-1じゃなくて回りきったら終わりとする +print("Yes")  # 必ず目標は達成できる +for p in parent[2:]:  # 部屋2以降の親（前の部屋）