#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <cctype>
#define N 301000
template<typename T> inline void read(T &x) {
	x = 0; char c = getchar(); bool flag = false;
	while (!isdigit(c)) { if (c == '-') flag = true; c = getchar(); }
	while (isdigit(c)) x = x * 10 + (c ^ 48), c = getchar();
	if (flag)	x = -x;
}
using namespace std;
const int inf = 1e9 + 10;
int n, m;
struct edge{
	int nxt, to;
	edge(){}
	edge(int jzp, int zzz) { nxt = jzp, to = zzz; }
}e[N << 1];
int head[N], ecnt;
inline void addedge(int from, int to) {
	e[++ecnt] = edge(head[from], to);
	head[from] = ecnt;
}
inline void Addedge(int u, int v) {
	addedge(u, v), addedge(v, u);
}

bool vis[N];
int que[N], front, rear, dep[N];
vector<int> vec[N];
inline void bfs() {
	front = rear = 0;
	for (int i = 1; i <= n; ++i)	dep[i] = inf;
	que[++rear] = 1;
	dep[1] = 1;
	while (front < rear) {
		int cur = que[++front]; vec[dep[cur]].push_back(cur);
		for (int i = head[cur]; i; i = e[i].nxt) {
			int to = e[i].to; if (dep[to] <= n)	continue;
			dep[to] = dep[cur] + 1; que[++rear] = to;
		}
	}
}

int ans[N], atot;
inline void work() {
	read(n), read(m);
	for (int i = 1; i <= m; ++i) {
		int u, v; read(u), read(v);
		Addedge(u, v);
	}
	bfs();
	for (int i = 1; i <= n; ++i) if (dep[i] > n) { puts("NO"); return ; }
	for (int d = 1; d <= n; ++d) {
		for (unsigned int j = 0; j < vec[d].size(); ++j) {
			int cur = vec[d][j];
			if (vis[cur])	continue;
			ans[++atot] = cur;
			for (int i = head[cur]; i; i = e[i].nxt) {
				int to = e[i].to; vis[to] = true;
			}
		}
	}
	puts("YES");
	printf("%d\n", atot);
	for (int i = 1; i <= atot; ++i)	printf("%d ", ans[i]);
	puts("");
}

inline void clear() {
	for (int i = 1; i <= n; ++i)	head[i] = 0, vis[i] = false, vec[i].clear();
	front = rear = atot = ecnt = 0;
}

int main() {
	int _; read(_);
	while (_--)	work(), clear();
	return 0;
}