# ノードの開始が'0'でなく'1'であることに注意!!※※※

# AtCoder Beginner Contest 168

# https://atcoder.jp/contests/abc168/tasks/abc168_d



import sys

input = sys.stdin.readline



n, m =  list(map(int, input().split())) # nは頂点の数、mは辺の数

pic = [[] for _ in range(n)] # 隣接リスト_初期化



for _ in range(m): # 隣接リスト_取り込み

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

    pic[a-1].append(b-1) # ※※※

    pic[b-1].append(a-1) # ※※※



from collections import deque



def BFS(u): # 'u'を開始位置として各頂点までの距離を探索する関数_dis → 探索元ノードを探索_ans

    queue = deque([u]) # dequeオブジェクトとして初期化、初期値は開始位置の'u'のみ

    dis = [None] * n # uからの距離を全ノード分初期化

    dis[u] = 0 # 自分'u'との距離は0

    ans = [-1] * n # 探索元のノードを格納する

    while queue:

        v = queue.popleft() # v:探索元のノード 

        for i in pic[v]: # pic[v]: 探索元のノードに隣接するノードのリスト

            if ans[i] == -1:

                ans[i] = v

            if dis[i] is None:

                dis[i] = dis[v] + 1

                queue.append(i)

    return ans



tmp = BFS(0) # ここは'1'でなく'0'※※※

print('Yes')

for j in tmp[1:]:

    print((j+1)) # ※※※
# ダミーノード'0'を設定 ※※※

# AtCoder Beginner Contest 168

# https://atcoder.jp/contests/abc168/tasks/abc168_d



import sys

input = sys.stdin.readline



n, m =  list(map(int, input().split())) # nは頂点の数、mは辺の数

pic = [[] for _ in range(n+1)] # 隣接リスト_初期化 ※※※



for _ in range(m): # 隣接リスト_取り込み

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

    pic[a].append(b) # ※※※

    pic[b].append(a) # ※※※



from collections import deque



def BFS(u): # 'u'を開始位置として各頂点までの距離を探索する関数_dis → 親ノードを探索して'ans'に記録

    queue = deque([u]) # dequeオブジェクトとして初期化、初期値は開始位置の'u'のみ

    dis = [None] * (n+1) # uからの距離を全ノード分初期化 ※※※

    dis[u] = 0 # 開始位置'u'の距離は'0'

    ans = [-1] * (n+1) # 親ノードを記録する

    while queue:

        v = queue.popleft() # 'v'に探索候補のノードを popleft

        for i in pic[v]: # pic[v]: 探索候補のノードに隣接するノードのリスト

            if ans[i] == -1: # 親ノードを記録

                ans[i] = v

            if dis[i] is None:

                dis[i] = dis[v]

                queue.append(i)

    return ans



tmp = BFS(1) # ここは開始位置'1'

print('Yes')

for j in tmp[2:]:

    print(j) # ※※※

# ノードの開始が'0'でなく'1'であることに注意!!※※※
# AtCoder Beginner Contest 168
# https://atcoder.jp/contests/abc168/tasks/abc168_d
import sys

input = sys.stdin.readline
n, m = list(map(int, input().split()))  # nは頂点の数、mは辺の数
pic = [[] for _ in range(n)]  # 隣接リスト_初期化
for _ in range(m):  # 隣接リスト_取り込み
    a, b = list(map(int, input().split()))
    pic[a - 1].append(b - 1)  # ※※※
    pic[b - 1].append(a - 1)  # ※※※
from collections import deque


def BFS(u):  # 'u'を開始位置として各頂点までの距離を探索する関数_dis → 探索元ノードを探索_ans
    queue = deque([u])  # dequeオブジェクトとして初期化、初期値は開始位置の'u'のみ
    dis = [None] * n  # uからの距離を全ノード分初期化
    dis[u] = 0  # 自分'u'との距離は0
    ans = [-1] * n  # 探索元のノードを格納する
    while queue:
        v = queue.popleft()  # v:探索元のノード
        for i in pic[v]:  # pic[v]: 探索元のノードに隣接するノードのリスト
            if ans[i] == -1:
                ans[i] = v
            if dis[i] is None:
                dis[i] = dis[v] + 1
                queue.append(i)
    return ans


tmp = BFS(0)  # ここは'1'でなく'0'※※※
print("Yes")
for j in tmp[1:]:
    print((j + 1))  # ※※※

# ダミーノード'0'を設定 ※※※
# AtCoder Beginner Contest 168
# https://atcoder.jp/contests/abc168/tasks/abc168_d
import sys

input = sys.stdin.readline
n, m = list(map(int, input().split()))  # nは頂点の数、mは辺の数
pic = [[] for _ in range(n + 1)]  # 隣接リスト_初期化 ※※※
for _ in range(m):  # 隣接リスト_取り込み
    a, b = list(map(int, input().split()))
    pic[a].append(b)  # ※※※
    pic[b].append(a)  # ※※※
from collections import deque


def BFS(u):  # 'u'を開始位置として各頂点までの距離を探索する関数_dis → 親ノードを探索して'ans'に記録
    queue = deque([u])  # dequeオブジェクトとして初期化、初期値は開始位置の'u'のみ
    dis = [None] * (n + 1)  # uからの距離を全ノード分初期化 ※※※
    dis[u] = 0  # 開始位置'u'の距離は'0'
    ans = [-1] * (n + 1)  # 親ノードを記録する
    while queue:
        v = queue.popleft()  # 'v'に探索候補のノードを popleft
        for i in pic[v]:  # pic[v]: 探索候補のノードに隣接するノードのリスト
            if ans[i] == -1:  # 親ノードを記録
                ans[i] = v
            if dis[i] is None:
                dis[i] = dis[v]
                queue.append(i)
    return ans


tmp = BFS(1)  # ここは開始位置'1'
print("Yes")
for j in tmp[2:]:
    print(j)  # ※※※

-# ノードの開始が'0'でなく'1'であることに注意!!※※※ +# ダミーノード'0'を設定 ※※※ -pic = [[] for _ in range(n)]  # 隣接リスト_初期化 +pic = [[] for _ in range(n + 1)]  # 隣接リスト_初期化 ※※※ -    pic[a - 1].append(b - 1)  # ※※※ -    pic[b - 1].append(a - 1)  # ※※※ +    pic[a].append(b)  # ※※※ +    pic[b].append(a)  # ※※※ -def BFS(u):  # 'u'を開始位置として各頂点までの距離を探索する関数_dis → 探索元ノードを探索_ans +def BFS(u):  # 'u'を開始位置として各頂点までの距離を探索する関数_dis → 親ノードを探索して'ans'に記録 -    dis = [None] * n  # uからの距離を全ノード分初期化 -    dis[u] = 0  # 自分'u'との距離は0 -    ans = [-1] * n  # 探索元のノードを格納する +    dis = [None] * (n + 1)  # uからの距離を全ノード分初期化 ※※※ +    dis[u] = 0  # 開始位置'u'の距離は'0' +    ans = [-1] * (n + 1)  # 親ノードを記録する -        v = queue.popleft()  # v:探索元のノード -        for i in pic[v]:  # pic[v]: 探索元のノードに隣接するノードのリスト -            if ans[i] == -1: +        v = queue.popleft()  # 'v'に探索候補のノードを popleft +        for i in pic[v]:  # pic[v]: 探索候補のノードに隣接するノードのリスト +            if ans[i] == -1:  # 親ノードを記録 -                dis[i] = dis[v] + 1 +                dis[i] = dis[v] -tmp = BFS(0)  # ここは'1'でなく'0'※※※ +tmp = BFS(1)  # ここは開始位置'1' -for j in tmp[1:]: -    print((j + 1))  # ※※※ +for j in tmp[2:]: +    print(j)  # ※※※