#include <bits/stdc++.h>
using namespace std;
const int MAXN = 2e5 + 3;
const int INF = 0x3f3f3f3f;
const int MOD = 1e9 + 7;
vector<int> G[MAXN];
struct edge {
  int u, v, cost;
};
struct deg {
  int num;
  int dot;
};
int fa[MAXN];
int rak[MAXN];
deg degree[MAXN];
void init() {
  for (int i = 0; i < MAXN; ++i) {
    fa[i] = i;
    rak[i] = 0;
  }
}
int Find(int x) {
  if (x == fa[x]) return x;
  return fa[x] = Find(fa[x]);
}
bool same(int x, int y) { return Find(x) == Find(y); }
bool cmp(deg a, deg b) { return a.num > b.num; }
void unite(int x, int y) {
  x = Find(x);
  y = Find(y);
  if (x == y) return;
  if (rak[x] > rak[y])
    fa[y] = x;
  else {
    fa[x] = y;
    if (rak[x] == rak[y]) rak[y]++;
  }
}
int main() {
  init();
  int n, m;
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= n; ++i) degree[i].dot = i;
  for (int i = 0; i < m; ++i) {
    int u, v;
    scanf("%d%d", &u, &v);
    degree[u].num++;
    degree[v].num++;
    G[u].push_back(v);
    G[v].push_back(u);
  }
  sort(degree + 1, degree + n + 1, cmp);
  bool ok = false;
  int cnt = 0;
  for (int i = 1; i <= n; ++i) {
    int u = degree[i].dot;
    for (int j = 0; j < G[u].size(); ++j) {
      if (!same(u, G[u][j])) {
        cnt++;
        unite(u, G[u][j]);
        printf("%d %d\n", u, G[u][j]);
        if (cnt == n - 1) {
          ok = true;
          break;
        }
      }
    }
    if (ok) break;
  }
  return 0;
}
