#include <bits/stdc++.h>
using namespace std;
#define int long long
#define double long double
#define pii pair<int, int>
#define MOD 1000000007
int pow_mod(int x, int p, int m = MOD) {
int r = 1;
while (p > 0) {
if (p % 2 == 1) {
r *= x;
r %= m;
}
p /= 2;
x *= x;
x %= m;
}
return r;
}
void scc_dfs(const auto& g, auto& v, auto& s, int i) {
if (v[i]) {
return;
}
v[i] = true;
for (int j : g[i]) {
scc_dfs(g, v, s, j);
}
s.push_back(i);
}
void scc(const auto& g, auto& h) {
int N = g.size();
vector<int> v;
vector<int> s;
v.assign(N, false);
for (int i = 0; i < N; i++) {
scc_dfs(g, v, s, i);
}
vector<vector<int>> gt(N);
for (int i = 0; i < N; i++) {
for (int j : g[i]) {
gt[j].push_back(i);
}
}
reverse(s.begin(), s.end());
v.assign(N, false);
for (int i : s) {
if (v[i]) {
continue;
}
h.emplace_back();
scc_dfs(gt, v, h.back(), i);
}
}
signed main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
#ifdef CB
freopen("be2.txt", "r", stdin);
// freopen("out.txt", "w", stdout);
#endif
int T;
cin >> T;
while (T--) {
int N, K;
cin >> N >> K;
N++;
vector<vector<int>> g(N * 2);
for (int i = 0; i < K; i++) {
int a, b;
cin >> a >> b;
g[a - 1].push_back(N + b);
g[N + a - 1].push_back(b);
g[b].push_back(N + a - 1);
g[N + b].push_back(a - 1);
}
vector<vector<int>> h;
scc(g, h);
bool ok = true;
for (int i = 0; i < h.size(); i++) {
set<int> s;
for (int j : h[i]) {
if (s.count((N + j)%(N*2)))ok=false;
s.insert(j);
}
}
cout << (!ok ? 0 : pow_mod(2, h.size() / 2 - 1)) << endl;
}
return 0;
}