#include<bits/stdc++.h>
// #pragma optimize("-O3")
//  #pragma GCC optimize("Ofast")
// #pragma GCC optimize("unroll-loops")
// #pragma GCC target("sse,sse2,sse3,sse4,popcnt,abm,avx,mmx,tune=native")
using namespace std;
#define pb push_back
#define mp make_pair
#define ff first
#define ss second
#define INF 1e9
#define BIG_INF 1e18
#define vi vector<ll>
#define sz(a) ll((a).size())
#define rep(i, begin, end) for (__typeof(end) i = (begin) - ((begin) > (end)); i != (end) - ((begin) > (end)); i += 1)
// #include <ext/pb_ds/assoc_container.hpp> // Common file
// #include <ext/pb_ds/tree_policy.hpp> // Including tree_order_statistics_node_update
// typedef tree<
// ll,
// null_type,
// less<ll>,
// rb_tree_tag,
// tree_order_statistics_node_update>
// ordered_set;
 
typedef long long ll;
ll mod = 1e9 + 7;
 long long fast_exp(long long a, long long b)
{
    if(b <= 0)
       return 1;
    else
    {
       long long res = 1;
       res = fast_exp(a,b/2);
       res = (res*res)%mod;
       if(b%2 == 1)
          res = (res*a)%mod;
       return res;
 
    }
}

typedef long double ld;
const long long N = 5e5+1000;
const long double pi = acos(-1.0);

// struct node{
//     ll random = 0;
//     ll dist = 0;
//     ll num;

//     bool operator < (node b)
//     {
//         if(a.)
//     }
// }
vector <int> edge[N];
int vis[N] = {};

int cnt = 0;


int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    // freopen("area1.in","r",stdin);
    // freopen("area1.out","w",stdout);
    int t;
    cin >> t;
    while(t--)
    {
        cnt = 0;
        
        int n, m;
        cin >> n >> m;
        for(int i = 1; i<=n; i++)
        {
            edge[i].clear();
            vis[i] = 0;
        }
        int u, v;
        vector <pair<int,int>> vec;
        for(int i = 0; i<m; i++)
        {
            cin >> u >> v;
            edge[v].pb(u);
            edge[u].pb(v);
        
        }
        set <int> black_set, white_set;
        int start = 1;
        black_set.insert(start);
        vector<int> final_list;
        map <int,int> col;
        int poss = 1;
        while(!black_set.empty())
        {
            int cur = *black_set.begin();
            black_set.erase(cur);
            final_list.pb(cur);
            vis[cur] = 1;
            cnt++;
            for(auto e: edge[cur])
            {
                if(vis[e] == 0)
                {
                    vis[e] = 1;
                    cnt++;
                    if(black_set.find(e) != black_set.end())
                        black_set.erase(e);
                    for(auto ed: edge[e])
                    {   
                        if(vis[ed] == 0)
                            black_set.insert(ed);
                    }
                }
                else
                {
                    // if(col[e] == 1)
                    // {
                    //     poss = 0;
                    //     break;
                    // }
                }

            }

        }
        if(cnt == n && poss == 1)
        {
            cout << "YES\n";
            cout << final_list.size() << '\n';
            for(auto e: final_list)
                cout << e << " ";
            cout << '\n';
        }
        else
            cout << "NO\n";
        
    }


    // cerr<< '\n' << "Time elapsed :" << clock() * 1000.0 / CLOCKS_PER_SEC << " ms\n" ;
    return 0;
    
    
}










 