#include <bits/stdc++.h>
using namespace std;
using namespace std;
long long gcdx(long long a, long long b) { return b ? gcdx(b, a % b) : a; }
long long gcd(long long a, long long b) { return gcdx(abs(a), abs(b)); }
void setbit(int &m, int ind, int val) {
  if (val)
    m = (m | (1 << ind));
  else
    m = (m & ~(1 << ind));
}
bool getbit(int m, int ind) {
  int a = (1 << ind);
  a = (a & m);
  return a;
}
int cntbits(int m) {
  int ret = 0;
  while (m) {
    ret += (m % 2);
    m /= 2;
  }
  return ret;
}
bool smlltr(char c) {
  if (c >= 'a' && c <= 'z') return 1;
  return 0;
}
bool capltr(char c) {
  if (c >= 'A' && c <= 'Z') return 1;
  return 0;
}
const long long mod = 1000000007;
const long long mod2 = 998244353;
const long long mod3 = 1000000009;
long long pow_mod(long long a, long long b) {
  if (b == 0) return 1;
  if (b % 2) return (a * pow_mod((a * a) % mod, b / 2)) % mod;
  return pow_mod((a * a) % mod, b / 2);
}
int n, m, k, L, tmp, maxi, mini, x, y, z, Q, q, ans, r, l, d[200100], cnt0,
    cnt1;
string s;
bool flag;
vector<int> v[200100];
bool vis[200100];
void dfs(int node) {
  vis[node] = 1;
  for (int i = 0; i < v[node].size(); i++)
    if (!vis[v[node][i]]) {
      int son = v[node][i];
      d[son] = d[node] + 1;
      dfs(son);
    }
}
void reset() {
  for (int i = 0; i <= n; i++) {
    vis[i] = 0;
    v[i].clear();
  }
  cnt0 = 0, cnt1 = 0;
}
int main() {
  cin >> Q;
  while (Q--) {
    reset();
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= m; i++) {
      int a, b;
      scanf("%d%d", &a, &b);
      {
        v[a].push_back(b);
        v[b].push_back(a);
      };
    };
    dfs(1);
    for (int i = 1; i <= n; i++)
      if (d[i] % 2 == 0) cnt0++;
    cnt1 = n - cnt0;
    if (cnt1 < cnt0) {
      cout << cnt1 << endl;
      for (int i = 1; i <= n; i++)
        if (d[i] % 2) cout << i << " ";
    } else {
      cout << cnt0 << endl;
      for (int i = 1; i <= n; i++)
        if (d[i] % 2 == 0) cout << i << " ";
    }
    cout << endl;
  }
  return 0;
}
