#

# 　　  ⋀_⋀　 

#　　  (･ω･)  

# .／ Ｕ ∽ Ｕ＼

#  │＊　合　＊│

#  │＊　格　＊│ 

#  │＊　祈　＊│ 

#  │＊　願　＊│ 

#  │＊　　　＊│ 

#      ￣

#

import sys

sys.setrecursionlimit(10**6)

input=sys.stdin.readline

from math import floor,sqrt,factorial,hypot,log #log2ないｙｐ

from heapq import heappop, heappush, heappushpop

from collections import Counter,defaultdict,deque

from itertools import accumulate,permutations,combinations,product,combinations_with_replacement

from bisect import bisect_left,bisect_right

from copy import deepcopy

from fractions import gcd

from random import randint

def ceil(a,b): return (a+b-1)//b

inf=float('inf')

mod = 10**9+7

def pprint(*A): 

    for a in A:     print(*a,sep='\n')

def INT_(n): return int(n)-1

def MI(): return map(int,input().split())

def MF(): return map(float, input().split())

def MI_(): return map(INT_,input().split())

def LI(): return list(MI())

def LI_(): return [int(x) - 1 for x in input().split()]

def LF(): return list(MF())

def LIN(n:int): return [I() for _ in range(n)]

def LLIN(n: int): return [LI() for _ in range(n)]

def LLIN_(n: int): return [LI_() for _ in range(n)]

def LLI(): return [list(map(int, l.split() )) for l in input()]

def I(): return int(input())

def F(): return float(input())

def ST(): return input().replace('\n', '')

def main():

    N,M=MI()

    edge = [[] for _ in range(N)]

    for i in range(M):

        a,b = MI_()

        edge[a].append(b)

        edge[b].append(a)

    queue = deque([0])

    dist = [inf]*N

    dist[0] = 0

    ans = [-1]*N

    while(queue):

        v = queue.popleft()

        for to in edge[v]:

            if(dist[to]==inf):

                ans[to] = v+1

                queue.append(to)

                dist[to] = dist[v] + 1



    print("Yes")

    print(*ans[1:],sep="\n")



    

if __name__ == '__main__':

    main()

n,m = list(map(int,input().split()))

AB = []

ans = [0] * (n-1)



edge = [[] for _ in range(n+1)] #edge[i] := 頂点iから伸びてる辺の行き先のリスト



for i in range(m):

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

    edge[a].append(b)    

    edge[b].append(a)    

    

import collections

que = collections.deque()

que.append(1)

    

while que:

    x = que.popleft()

    

    for to in edge[x]:

        a = x

        b = to

        

        if b!=1 and ans[b-2] == 0:

            ans[b-2] = x

            que.append(b)

            

if 0 in ans:

    print("No")

else:

    print("Yes")

    

    for i in ans:

        print(i)

#
# 　　  ⋀_⋀
# 　　  (･ω･)
# .／ Ｕ ∽ Ｕ＼
#  │＊　合　＊│
#  │＊　格　＊│
#  │＊　祈　＊│
#  │＊　願　＊│
#  │＊　　　＊│
#      ￣
#
import sys

sys.setrecursionlimit(10**6)
input = sys.stdin.readline
from math import floor, sqrt, factorial, hypot, log  # log2ないｙｐ
from heapq import heappop, heappush, heappushpop
from collections import Counter, defaultdict, deque
from itertools import (
    accumulate,
    permutations,
    combinations,
    product,
    combinations_with_replacement,
)
from bisect import bisect_left, bisect_right
from copy import deepcopy
from fractions import gcd
from random import randint


def ceil(a, b):
    return (a + b - 1) // b


inf = float("inf")
mod = 10**9 + 7


def pprint(*A):
    for a in A:
        print(*a, sep="\n")


def INT_(n):
    return int(n) - 1


def MI():
    return map(int, input().split())


def MF():
    return map(float, input().split())


def MI_():
    return map(INT_, input().split())


def LI():
    return list(MI())


def LI_():
    return [int(x) - 1 for x in input().split()]


def LF():
    return list(MF())


def LIN(n: int):
    return [I() for _ in range(n)]


def LLIN(n: int):
    return [LI() for _ in range(n)]


def LLIN_(n: int):
    return [LI_() for _ in range(n)]


def LLI():
    return [list(map(int, l.split())) for l in input()]


def I():
    return int(input())


def F():
    return float(input())


def ST():
    return input().replace("\n", "")


def main():
    N, M = MI()
    edge = [[] for _ in range(N)]
    for i in range(M):
        a, b = MI_()
        edge[a].append(b)
        edge[b].append(a)
    queue = deque([0])
    dist = [inf] * N
    dist[0] = 0
    ans = [-1] * N
    while queue:
        v = queue.popleft()
        for to in edge[v]:
            if dist[to] == inf:
                ans[to] = v + 1
                queue.append(to)
                dist[to] = dist[v] + 1
    print("Yes")
    print(*ans[1:], sep="\n")


if __name__ == "__main__":
    main()

n, m = list(map(int, input().split()))
AB = []
ans = [0] * (n - 1)
edge = [[] for _ in range(n + 1)]  # edge[i] := 頂点iから伸びてる辺の行き先のリスト
for i in range(m):
    a, b = list(map(int, input().split()))
    edge[a].append(b)
    edge[b].append(a)
import collections

que = collections.deque()
que.append(1)
while que:
    x = que.popleft()
    for to in edge[x]:
        a = x
        b = to
        if b != 1 and ans[b - 2] == 0:
            ans[b - 2] = x
            que.append(b)
if 0 in ans:
    print("No")
else:
    print("Yes")
    for i in ans:
        print(i)

-# -# 　　  ⋀_⋀ -# 　　  (･ω･) -# .／ Ｕ ∽ Ｕ＼ -#  │＊　合　＊│ -#  │＊　格　＊│ -#  │＊　祈　＊│ -#  │＊　願　＊│ -#  │＊　　　＊│ -#      ￣ -# -import sys +n, m = list(map(int, input().split())) +AB = [] +ans = [0] * (n - 1) +edge = [[] for _ in range(n + 1)]  # edge[i] := 頂点iから伸びてる辺の行き先のリスト +for i in range(m): +    a, b = list(map(int, input().split())) +    edge[a].append(b) +    edge[b].append(a) +import collections -sys.setrecursionlimit(10**6) -input = sys.stdin.readline -from math import floor, sqrt, factorial, hypot, log  # log2ないｙｐ -from heapq import heappop, heappush, heappushpop -from collections import Counter, defaultdict, deque -from itertools import ( -    accumulate, -    permutations, -    combinations, -    product, -    combinations_with_replacement, -) -from bisect import bisect_left, bisect_right -from copy import deepcopy -from fractions import gcd -from random import randint - - -def ceil(a, b): -    return (a + b - 1) // b - - -inf = float("inf") -mod = 10**9 + 7 - - -def pprint(*A): -    for a in A: -        print(*a, sep="\n") - - -def INT_(n): -    return int(n) - 1 - - -def MI(): -    return map(int, input().split()) - - -def MF(): -    return map(float, input().split()) - - -def MI_(): -    return map(INT_, input().split()) - - -def LI(): -    return list(MI()) - - -def LI_(): -    return [int(x) - 1 for x in input().split()] - - -def LF(): -    return list(MF()) - - -def LIN(n: int): -    return [I() for _ in range(n)] - - -def LLIN(n: int): -    return [LI() for _ in range(n)] - - -def LLIN_(n: int): -    return [LI_() for _ in range(n)] - - -def LLI(): -    return [list(map(int, l.split())) for l in input()] - - -def I(): -    return int(input()) - - -def F(): -    return float(input()) - - -def ST(): -    return input().replace("\n", "") - - -def main(): -    N, M = MI() -    edge = [[] for _ in range(N)] -    for i in range(M): -        a, b = MI_() -        edge[a].append(b) -        edge[b].append(a) -    queue = deque([0]) -    dist = [inf] * N -    dist[0] = 0 -    ans = [-1] * N -    while queue: -        v = queue.popleft() -        for to in edge[v]: -            if dist[to] == inf: -                ans[to] = v + 1 -                queue.append(to) -                dist[to] = dist[v] + 1 +que = collections.deque() +que.append(1) +while que: +    x = que.popleft() +    for to in edge[x]: +        a = x +        b = to +        if b != 1 and ans[b - 2] == 0: +            ans[b - 2] = x +            que.append(b) +if 0 in ans: +    print("No") +else: -    print(*ans[1:], sep="\n") - - -if __name__ == "__main__": -    main() +    for i in ans: +        print(i)