//杭电多校第六场 1010.Planar Graph
/*****************
 * 平面图的欧拉定理 ( 分别为点, 边, 面, 连通分量的个数) V - E + F = k + 1 
 * 求连通分量k可以用dfs求联动块的方式!
 * 当然k = m - cnt (cnt为生成树的用的边数!)
 * 删除边的个数ans = E - V + k;
 * 由原方程得 V - (E - ans) + F = k + 1;
 * 面F变为1,解方程可得 ans = E - v + k;
*****************/
#include <bits/stdc++.h>
using namespace std;
//#define fre
const int N = 2e5+9;
int p[N],vis[N];
vector<int> to[N];
struct node
{
    int a,b;
}e[N];

int find(int x)
{
    if(p[x] != x) return p[x] = find(p[x]);
    return x;
}
bool st[N];
void dfs(int u)
{
    st[u] = true;
    for(auto v : to[u])
    {
        if(!st[v]) dfs(v);
    }
}
int main()
{
    #ifdef fre
    freopen("planar graph.in","r",stdin);
    #endif
    ios_base :: sync_with_stdio(false); cin.tie(nullptr);
    int _;
    cin >> _;
    while(_--)
    {
        memset(p,0,sizeof(p));
        memset(vis,0,sizeof(vis));
        int n,m;
        cin >> n >> m;
        for(int i=1; i<=n; i++) to[i].clear(),st[i] = 0;
        for(int i=1; i<=m; i++)
        {
            int a,b;
            cin >> a >> b;
            to[a].emplace_back(b);
            to[b].emplace_back(a);
            e[i] = {a,b};
        }
        for(int i=1; i<=n; i++) p[i] = i;
        int ans = 0;
        for(int i=1; i<=n; i++)
        {
            if(!st[i])
            {
                dfs(i);
                ans++;
            }
        }
        for(int i=m; i>=1; i--)
        {
            int px = find(e[i].a),py = find(e[i].b);
            if(px != py)
            {
                vis[i] = 1;
                p[px] = py;
            }
        }
        ans = m - n + ans;
        cout<<ans<<"\n";
        for(int i=1; i<=m; i++)
        {
            if(!vis[i]) cout<<i<<" ";
        }
        cout<<"\n";
    }
    return 0;
}