/*
  Copyright 2011 Marek "p2004a" Rusinowski
  Breadth-first search
*/
#include <cstdio>
#include <vector>
#include <queue>

#define MAXN 1000000

std::vector<int> edges[MAXN];
bool visited[MAXN];

void bfs(int v) {
  std::queue<int> q;
  q.push(v);
  visited[v] = true;
  while (!q.empty()) {
    int v = q.front();
    q.pop();
    printf("%d ", v + 1);
    for (unsigned i = 0; i < edges[v].size(); ++i) {
      if (!visited[edges[v][i]]) {
        visited[edges[v][i]] = true;
        q.push(edges[v][i]);
      }
    }
  }
}

int main() {
  int n, m, a, b;
  scanf("%d %d", &n, &m);
  for (int i = 0; i < m; ++i) {
    scanf("%d %d", &a, &b);
    edges[--a].push_back(--b);
    edges[b].push_back(a);
  }
  bfs(0);
  printf("\n");
  return 0;
}
