#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
#include <map>
#include <set>
#include <bits/stdc++.h>
using namespace std;
#include <ext/pb_ds/assoc_container.hpp>
using namespace __gnu_pbds;
template <class T>
using orderStaticTree =
tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
#define ll long long
#define saleh \
ios_base::sync_with_stdio(false); \
cin.tie(nullptr);
const int md = 1e9 + 7;
#define ll long long
const ll remo = -1e18;
long long fastPower(long long base, long long exponent)
{
long long result = 1;
while (exponent > 0)
{
if (exponent % 2 == 1)
{
result = (result * base) % md;
}
base = (base * base) % md;
exponent /= 2;
}
return result % md;
}
const int maxi = 1e5 + 100;
vector<int> adj[maxi];
vector<bool> vis(maxi);
void dfs(int node)
{
vis[node] = 1;
for (int i : adj[node])
{
if (!vis[i])
{
dfs(i);
}
}
}
int main()
{
saleh;
int t;
cin >> t;
while (t--)
{
int n;
cin >> n;
for (int i = 1; i <= maxi - 1; i++)
{
adj[i].clear();
vis[i] = 0;
}
for (int i = 0; i < n; i++)
{
int a, b;
cin >> a >> b;
adj[a].push_back(b);
adj[b].push_back(a);
}
int ans = 0;
for (int i = 1; i <= n; i++)
{
if (!vis[i])
{
ans++;
dfs(i);
}
}
ll ansii = fastPower(2, ans)%md - 1;
cout << ansii%md << endl;
}
return 0;
}
CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPHF1ZXVlPgojaW5jbHVkZSA8bWFwPgojaW5jbHVkZSA8c2V0PgojaW5jbHVkZSA8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKI2luY2x1ZGUgPGV4dC9wYl9kcy9hc3NvY19jb250YWluZXIuaHBwPgp1c2luZyBuYW1lc3BhY2UgX19nbnVfcGJkczsKdGVtcGxhdGUgPGNsYXNzIFQ+CnVzaW5nIG9yZGVyU3RhdGljVHJlZSA9CiAgICB0cmVlPFQsIG51bGxfdHlwZSwgbGVzczxUPiwgcmJfdHJlZV90YWcsIHRyZWVfb3JkZXJfc3RhdGlzdGljc19ub2RlX3VwZGF0ZT47CgojZGVmaW5lIGxsIGxvbmcgbG9uZwoKI2RlZmluZSBzYWxlaCAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsgXAogICAgY2luLnRpZShudWxscHRyKTsKCmNvbnN0IGludCBtZCA9IDFlOSArIDc7CiNkZWZpbmUgbGwgbG9uZyBsb25nCgpjb25zdCBsbCByZW1vID0gLTFlMTg7Cgpsb25nIGxvbmcgZmFzdFBvd2VyKGxvbmcgbG9uZyBiYXNlLCBsb25nIGxvbmcgZXhwb25lbnQpCnsKICAgIGxvbmcgbG9uZyByZXN1bHQgPSAxOwogICAgd2hpbGUgKGV4cG9uZW50ID4gMCkKICAgIHsKICAgICAgICBpZiAoZXhwb25lbnQgJSAyID09IDEpCiAgICAgICAgewogICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICogYmFzZSkgJSBtZDsKICAgICAgICB9CiAgICAgICAgYmFzZSA9IChiYXNlICogYmFzZSkgJSBtZDsKICAgICAgICBleHBvbmVudCAvPSAyOwogICAgfQogICAgcmV0dXJuIHJlc3VsdCAlIG1kOwp9CmNvbnN0IGludCBtYXhpID0gMWU1ICsgMTAwOwp2ZWN0b3I8aW50PiBhZGpbbWF4aV07CnZlY3Rvcjxib29sPiB2aXMobWF4aSk7Cgp2b2lkIGRmcyhpbnQgbm9kZSkKewogICAgdmlzW25vZGVdID0gMTsKICAgIGZvciAoaW50IGkgOiBhZGpbbm9kZV0pCiAgICB7CiAgICAgICAgaWYgKCF2aXNbaV0pCiAgICAgICAgewogICAgICAgICAgICBkZnMoaSk7CiAgICAgICAgfQogICAgfQp9CgppbnQgbWFpbigpCnsKICAgIHNhbGVoOwogICAgaW50IHQ7CiAgICBjaW4gPj4gdDsKICAgIHdoaWxlICh0LS0pCiAgICB7CgogICAgICAgIGludCBuOwogICAgICAgIGNpbiA+PiBuOwogICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IG1heGkgLSAxOyBpKyspCiAgICAgICAgewogICAgICAgICAgICBhZGpbaV0uY2xlYXIoKTsKICAgICAgICAgICAgdmlzW2ldID0gMDsKICAgICAgICB9CgogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKQogICAgICAgIHsKICAgICAgICAgICAgaW50IGEsIGI7CiAgICAgICAgICAgIGNpbiA+PiBhID4+IGI7CiAgICAgICAgICAgIGFkalthXS5wdXNoX2JhY2soYik7CiAgICAgICAgICAgIGFkaltiXS5wdXNoX2JhY2soYSk7CiAgICAgICAgfQogICAgICAgIGludCBhbnMgPSAwOwogICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IG47IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIGlmICghdmlzW2ldKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBhbnMrKzsKICAgICAgICAgICAgICAgIGRmcyhpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgbGwgYW5zaWkgPSBmYXN0UG93ZXIoMiwgYW5zKSVtZCAtIDE7CiAgICAgICAgY291dCA8PCBhbnNpaSVtZCA8PCBlbmRsOwogICAgfQoKICAgIHJldHVybiAwOwp9