Buggy python submission (verdict: Time Limit Exceeded):
import math
N,M = map(int,input().split())
route_list = [[0]*N for i in range(N)]
for i in range(M):
  a,b = map(int,input().split())
  route_list[a-1][b-1] = 1
  route_list[b-1][a-1] = 1


node_num = N #ノードの数

unsearched_nodes = list(range(node_num)) # 未探索ノード
distance = [math.inf] * node_num # ノードごとの距離のリスト
previous_nodes = [-1] * node_num # 最短経路でそのノードのひとつ前に到達するノードのリスト
distance[0] = 0 # 初期のノードの距離は0とする

# @GDaigo さんのコメントより関数の追加 2017/03/18
def get_target_min_index(min_index, distance, unsearched_nodes):
    start = 0
    while True:
        index = distance.index(min_index, start)
        found = index in unsearched_nodes
        if found:
            return index
        else:
            start = index + 1

while(len(unsearched_nodes) != 0): #未探索ノードがなくなるまで繰り返す
    # まず未探索ノードのうちdistanceが最小のものを選択する
    posible_min_distance = math.inf # 最小のdistanceを見つけるための一時的なdistance。初期値は inf に設定。
    for node_index in unsearched_nodes: # 未探索のノードのループ
        if posible_min_distance > distance[node_index]: 
           posible_min_distance = distance[node_index] # より小さい値が見つかれば更新
    target_min_index = get_target_min_index(posible_min_distance, distance, unsearched_nodes) # 未探索ノードのうちで最小のindex番号を取得
    unsearched_nodes.remove(target_min_index) # ここで探索するので未探索リストから除去

    target_edge = route_list[target_min_index] # ターゲットになるノードからのびるエッジのリスト
    for index, route_dis in enumerate(target_edge):
        if route_dis != 0:
            if distance[index] > (distance[ target_min_index] + route_dis):
                distance[index] = distance[ target_min_index] + route_dis # 過去に設定されたdistanceよりも小さい場合はdistanceを更新
                previous_nodes[index] =  target_min_index #　ひとつ前に到達するノードのリストも更新

# 以下で結果の表示
#print("-----距離-----")
ans = ''
j = 1
for i in range(1,N):
  if(i != N-1):
    ans += str(previous_nodes[i]+1)+'\n'
  else:  
    ans += str(previous_nodes[i]+1)
  if(previous_nodes[i]<0):
    j = 0

if(j == 1):
  print('Yes')
  print(ans)
else:
  print('No')

Fixed submission:
import math
import queue

N,M = map(int,input().split())
Map = [[] for i in range(N)]
for i in range(M):
  a,b = map(int,input().split())
  Map[a-1].append(b-1)
  Map[b-1].append(a-1)

# キューの定義
q = queue.Queue()
# キューにデータを挿入
q.put(0)
    
# キューからデータがなくなるまで取り出しを行う
flag = [0]*N 
flag[0]  = 1
ans_list = [0]*N

while(1):
  if(q.empty()):
    break
  num = q.get()
  for n in Map[num]:
    if(flag[n] != 1): # 訪問済みでないなら
      flag[n] = 1 # 訪問済みに
      ans_list[n] = num #　接続ノード(n)の1つ前のノードを今のノード(now)に
      q.put(n) # queueに接続ノードを入れる

print('Yes')
for i in range(1,N):
  print(ans_list[i]+1)

Buggy python submission (verdict: Time Limit Exceeded):
from scipy.sparse.csgraph import shortest_path, dijkstra
import numpy as np

N,M = map(int,input().split())
Map = np.array([np.array([0]*N) for i in range(N)])

for i in range(M):
  a,b = map(int,input().split())
  a,b = a-1,b-1
  Map[a][b] = 1
  Map[b][a] = 1
  
d,p = shortest_path(Map,indices=0, return_predecessors=True, directed=False, unweighted=True)
judge = 1 
ans = ''
for i in range(1,N):
  if(i != N-1):
     ans += str(p[i]+1)+'\n'
  else:
     ans += str(p[i]+1)   
  
  if(p[i]<0):
     judge = 0
     break

if(judge == 0):
  print('No')
else:
  print('Yes')
  print(ans)

Fixed submission:
import math
import queue

N,M = map(int,input().split())
Map = [[] for i in range(N)]
for i in range(M):
  a,b = map(int,input().split())
  Map[a-1].append(b-1)
  Map[b-1].append(a-1)

# キューの定義
q = queue.Queue()
# キューにデータを挿入
q.put(0)
    
# キューからデータがなくなるまで取り出しを行う
flag = [0]*N 
flag[0]  = 1
ans_list = [0]*N

while(1):
  if(q.empty()):
    break
  num = q.get()
  for n in Map[num]:
    if(flag[n] != 1): # 訪問済みでないなら
      flag[n] = 1 # 訪問済みに
      ans_list[n] = num #　接続ノード(n)の1つ前のノードを今のノード(now)に
      q.put(n) # queueに接続ノードを入れる

print('Yes')
for i in range(1,N):
  print(ans_list[i]+1)