#include <bits/stdc++.h>
using namespace std;
inline int read() {
  int ret = 0;
  char c = getchar();
  bool f = 1;
  while (c < '0' || c > '9') {
    if (c == '-') f = 0;
    c = getchar();
  }
  while (c <= '9' && c >= '0') {
    ret = (ret << 3) + (ret << 1) + (c ^ 48);
    c = getchar();
  }
  return f ? ret : -ret;
}
const int maxn = 205000;
vector<int> g[maxn];
int n, m, t, f[maxn], vis[maxn], pos[maxn], pre[maxn], cnt;
bool s1[maxn], s2[maxn];
void dfs(int u, int fa) {
  assert(cnt <= n);
  pos[++cnt] = u;
  for (int i = 0; i < g[u].size(); i++) {
    int v = g[u][i];
    if (v == fa) continue;
    if (!vis[v]) {
      vis[v] = 1;
      pre[v] = u;
      dfs(v, u);
    }
  }
}
int mds() {
  int ans = 0;
  for (int i = n; i >= 1; i--) {
    int u = pos[i];
    if (!s1[u]) {
      if (!s2[pre[u]]) {
        s2[pre[u]] = 1;
        ans++;
      }
      s1[u] = 1;
      s1[pre[u]] = 1;
      s1[pre[pre[u]]] = 1;
    }
  }
  return ans;
}
int find(int x) { return f[x] == x ? x : f[x] = find(f[x]); }
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  cin >> t;
  while (t--) {
    cin >> n >> m;
    cnt = 0;
    for (int i = 1; i <= n; i++) {
      g[i].clear();
      vis[i] = 0;
      f[i] = i;
      s1[i] = s2[i] = 0;
    }
    vis[1] = 1;
    pre[1] = 1;
    for (int i = 1, u, v; i <= m; i++) {
      cin >> u >> v;
      if (find(u) != find(v)) {
        g[u].push_back(v);
        g[v].push_back(u);
        f[find(u)] = find(v);
      }
    }
    dfs(1, -1);
    int tt = mds();
    if (tt > ((n / 2) + (n & 1))) {
      cout << n - tt << "\n";
      for (int i = 1; i <= n; i++)
        if (!s2[i]) cout << i << " ";
      cout << endl;
    } else {
      cout << tt << "\n";
      for (int i = 1; i <= n; i++)
        if (s2[i]) cout << i << " ";
      cout << endl;
    }
  }
  return 0;
}
