#include<bits/stdc++.h>
using namespace std;
#define PI 3.141592653589793238462
#define MAXN (int)(2e5 + 5)
#define MAXM (int)(2e7 + 5)
#define fr first
#define sd second
#define MP make_pair
#define pb push_back
#define SZ(A) (int)A.size()
#define ALL(v) v.begin(), v.end()
#define RALL(V) V.rbegin(), V.rend()
#define M0(a) memset(a, 0, sizeof(a))
#define M1(a) memset(a, -1, sizeof(a))
#define REP(i,n) for(int i = 0; i < int(n); i++)
#define RNG(i,m, n) for(int i = m; i <= int(n); i++)
#define RREP(i,n) for(int i = int(n-1); i >= 0; i--)
#define RRNG(i, m, n) for(int i = (int)n; i >= (int)m; i--)
typedef long long ll;
typedef unsigned long long ull;
typedef double db;
typedef long double ld;
const ll INF = ll(2e15);
const ll MOD = ll(1e9 + 7);
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef pair<pii, pii> ppii;
template<typename T, typename U> inline void AMIN(T &x, U y){ if(x > y) x = y;}
template<typename T, typename U> inline void AMAX(T &x, U y){ if(x < y) x = y;}
vector<vector<int>> G, cols;
vector<int> has_teacher, color, vis;

void bfs(int s) {
        queue<int> Q;
        Q.push(s);
        while(Q.size()) {
                int v = Q.front();
                Q.pop();
                vis[v] = 1;
                int cur = 1;
                set<int> kol;
                for(int u : G[v]) {
                        if(color[u])
                                kol.insert(color[u]);
                }
                for(int u : kol) {
                        if(u == cur)
                                cur++;
                }
                color[v] = cur;
                for(int u : G[v]) {
                        if(!vis[u])
                                Q.push(u), vis[u] = 1;
                }
        }
}

void dfs(int v) {
        vis[v] = 1;
        for(int u : G[v]) {
                if(vis[u] == 0 && (has_teacher[v] || has_teacher[u])) {
                        dfs(u);
                }
        }
}

void solve(int tt) {
        int N, M;
        cin >> N >> M;
        G.clear(), color.clear(), vis.clear(), has_teacher.clear(), cols.clear();
        G.resize(N + 5), color.resize(N + 5), vis.resize(N + 5), has_teacher.resize(N + 5);
        REP(i, M) {
                int v, u;
                cin >> v >> u;
                v--, u--;
                G[v].pb(u);
                G[u].pb(v);
        }  
        int comp = 0;      
        REP(i, N) {
                if(!vis[i])
                        bfs(i), comp++;
        }
        if(comp != 1) {
                cout << "NO\n";
                return;
        }
        int maxx = 0;
        REP(i, N) {
                maxx = max(maxx, color[i]), vis[i] = 0;
        }
        cols.resize(maxx + 1);
        REP(i, N) {
                cols[color[i]].pb(i);
        }
        REP(i, SZ(cols)) {
                for(int u : cols[i])
                        has_teacher[u] = 1;
                
                dfs(0);
                int comp_size = 0;
                REP(i, N) {
                        if(vis[i])
                                comp_size++;
                        
                        vis[i] = 0;
                }
                if(comp_size == N) {
                        cout << "YES\n" << cols[i].size() << endl;
                        for(int u : cols[i])
                                cout << u + 1 << " " ;       
                        cout << endl;
                        return;
                }
                for(int u : cols[i])
                        has_teacher[u] = 0;
        }
        cout << "NO\n";
}

int main() {
        // freopen("input.txt", "r", stdin);
        // freopen("output.txt", "w", stdout);
        ios_base::sync_with_stdio(false);
        cin.tie(NULL);
        int T;
        cin >> T;
        REP(i, T)
                solve(i); 
        return 0;
}
