//杭电多校第六场 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;
}