← Home
package main

import (
	"container/heap"
	"fmt"
)

type MinHeap []int

func (h MinHeap) Len() int           { return len(h) }
func (h MinHeap) Less(i, j int) bool { return h[i] < h[j] }
func (h MinHeap) Swap(i, j int)      { h[i], h[j] = h[j], h[i] }

func (h *MinHeap) Push(x interface{}) {
	*h = append(*h, x.(int))
}

func (h *MinHeap) Pop() interface{} {
	old := *h
	n := len(old)
	x := old[n-1]
	*h = old[0 : n-1]
	return x
}

func main() {
	var n, m int
	fmt.Scan(&n, &m)
	adj := make([][]int, n+1)
	for i := 0; i < m; i++ {
		var u, v int
		fmt.Scan(&u, &v)
		adj[u] = append(adj[u], v)
		adj[v] = append(adj[v], u)
	}
	visited := make([]bool, n+1)
	sequence := []int{1}
	visited[1] = true
	var hp MinHeap
	heap.Init(&hp)
	for _, nei := range adj[1] {
		if !visited[nei] {
			heap.Push(&hp, nei)
		}
	}
	for len(sequence) < n {
		if len(hp) == 0 {
			break
		}
		u := heap.Pop(&hp).(int)
		if visited[u] {
			continue
		}
		sequence = append(sequence, u)
		visited[u] = true
		for _, v := range adj[u] {
			if !visited[v] {
				heap.Push(&hp, v)
			}
		}
	}
	for i, node := range sequence {
		if i > 0 {
			fmt.Print(" ")
		}
		fmt.Print(node)
	}
	fmt.Println()
}