#include <bits/stdc++.h>
using namespace std;
vector<int> adj[200100];
vector<pair<long long int, long long int> > edge;
class DisjointSetUnion {
  int n;
  int *p, *r;

 public:
  DisjointSetUnion(int n) {
    this->n = n;
    p = new int[n + 1];
    r = new int[n + 1];
    for (int i = 0; i <= n; i++) r[i] = 1, p[i] = i;
  }
  void Union(int a, int b) {
    int x = Find(a);
    int y = Find(b);
    if (r[x] > r[y]) {
      p[y] = x;
      r[x] += r[y];
    } else {
      p[x] = y;
      r[y] += r[x];
    }
  }
  int Find(int x) {
    if (p[x] == x) return x;
    return p[x] = Find(p[x]);
  }
};
int main() {
  int i, j, k;
  int n, m;
  int u, v;
  int x, y;
  scanf("%d%d", &n, &m);
  for (i = 0; i < m; i++) {
    scanf("%d%d", &u, &v);
    adj[u].push_back(v);
    adj[v].push_back(u);
    edge.push_back({u, v});
  }
  x = 0, k = -1;
  for (i = 1; i <= n; i++) {
    if (adj[i].size() > x) x = adj[i].size(), k = i;
  }
  DisjointSetUnion dsu(n);
  for (i = 0; i < x; i++) {
    v = adj[k][i];
    if (dsu.Find(k) != dsu.Find(v)) {
      printf("%d %d", k, v);
      printf("\n");
      dsu.Union(k, v);
    }
  }
  for (i = 0; i < m; i++) {
    u = edge[i].first;
    v = edge[i].second;
    if (dsu.Find(u) != dsu.Find(v)) {
      printf("%d %d", u, v);
      printf("\n");
      dsu.Union(u, v);
    }
  }
  return 0;
}
