#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define endl '\n'
ll N = 1e9+7;
ll oo =1e13;
const ll maxx = 1000000 + 3;
ll n,m,k,q,x,y,z,l,r,mid,ans;
vector<ll>vis,out;
vector<vector<ll>>adj;
bool imp=false;
ll c1,c2;
void BFS(ll st) {
queue<ll>q;
q.push(st);
vis[st]=1;
out[st]=1;
c1++;
while (!q.empty()) {
ll cur = q.front();
q.pop();
for (auto x : adj[cur]) {
if (!vis[x]) {
vis[x]=1;
q.push(x);
out[x]=3-out[cur];
if (out[x] == 1)c1++;
else c2++;
}
if (out[x]==out[cur]) imp = true;
}
}
}
ll fastpower(ll p,ll mod) {
if (p==0)return 1;
ll s = fastpower(p/2,mod) % mod;
s*=s;
s%=mod;
if (p & 1)s*=2;
s%=mod;
return s;
}
void solve() {
cin >> n >>m;
adj.assign(n+1,{});
vis.assign(n+1,0);
out.assign(n+1,0);
for (ll i =0;i<m;i++) {
cin>>x>>y;
adj[x].push_back(y);
adj[y].push_back(x);
}
for (ll i =1;i<=n;i++) {
if (!vis[i]) {
c1=0,c2=0;
BFS(i);
ans=(ans*(fastpower(c1,998244353)%998244353+fastpower(c2,998244353)%998244353)%998244353)%998244353;
}
}
if (imp){cout<<0<<endl;}
else {
cout<<ans<<endl;
}
}
int main() {
ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
ll t=1 ;
cin >>t;
while (t--) {
ans=1;
solve();
imp =false;
}
}
CiNpbmNsdWRlIDxiaXRzL3N0ZGMrKy5oPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwojZGVmaW5lIGxsIGxvbmcgbG9uZwojZGVmaW5lIGVuZGwgJ1xuJwpsbCBOID0gMWU5Kzc7CgpsbCBvbyA9MWUxMzsKY29uc3QgbGwgbWF4eCA9IDEwMDAwMDAgKyAzOwpsbCBuLG0sayxxLHgseSx6LGwscixtaWQsYW5zOwp2ZWN0b3I8bGw+dmlzLG91dDsKdmVjdG9yPHZlY3RvcjxsbD4+YWRqOwpib29sIGltcD1mYWxzZTsKbGwgYzEsYzI7CnZvaWQgQkZTKGxsIHN0KSB7CiAgICBxdWV1ZTxsbD5xOwoKICAgIHEucHVzaChzdCk7CiAgICB2aXNbc3RdPTE7CiAgICBvdXRbc3RdPTE7CiAgICBjMSsrOwogICAgd2hpbGUgKCFxLmVtcHR5KCkpIHsKICAgICAgICBsbCBjdXIgPSBxLmZyb250KCk7CiAgICAgICAgcS5wb3AoKTsKICAgICAgICBmb3IgKGF1dG8geCA6IGFkaltjdXJdKSB7CiAgICAgICAgICAgIGlmICghdmlzW3hdKSB7CiAgICAgICAgICAgICAgICB2aXNbeF09MTsKICAgICAgICAgICAgICAgIHEucHVzaCh4KTsKICAgICAgICAgICAgICAgIG91dFt4XT0zLW91dFtjdXJdOwogICAgICAgICAgICAgICAgaWYgKG91dFt4XSA9PSAxKWMxKys7CiAgICAgICAgICAgICAgICBlbHNlIGMyKys7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKG91dFt4XT09b3V0W2N1cl0pIGltcCA9IHRydWU7CiAgICAgICAgfQogICAgfQp9CmxsIGZhc3Rwb3dlcihsbCBwLGxsIG1vZCkgewogICAgaWYgKHA9PTApcmV0dXJuICAxOwogICAgbGwgcyA9IGZhc3Rwb3dlcihwLzIsbW9kKSAlIG1vZDsKICAgIHMqPXM7CiAgICBzJT1tb2Q7CiAgICBpZiAocCAmIDEpcyo9MjsKICAgIHMlPW1vZDsKICAgIHJldHVybiBzOwp9CnZvaWQgc29sdmUoKSB7CiAgICBjaW4gPj4gbiA+Pm07CiAgICBhZGouYXNzaWduKG4rMSx7fSk7CiAgICB2aXMuYXNzaWduKG4rMSwwKTsKICAgIG91dC5hc3NpZ24obisxLDApOwoKICAgIGZvciAobGwgaSA9MDtpPG07aSsrKSB7CiAgICAgICAgY2luPj54Pj55OwogICAgICAgIGFkalt4XS5wdXNoX2JhY2soeSk7CiAgICAgICAgYWRqW3ldLnB1c2hfYmFjayh4KTsKICAgIH0KICAgIGZvciAobGwgaSA9MTtpPD1uO2krKykgewogICAgICAgIGlmICghdmlzW2ldKSB7CiAgICAgICAgICAgIGMxPTAsYzI9MDsKICAgICAgICAgICAgQkZTKGkpOwogICAgICAgICAgICBhbnM9KGFucyooZmFzdHBvd2VyKGMxLDk5ODI0NDM1MyklOTk4MjQ0MzUzK2Zhc3Rwb3dlcihjMiw5OTgyNDQzNTMpJTk5ODI0NDM1MyklOTk4MjQ0MzUzKSU5OTgyNDQzNTM7CiAgICAgICAgfQogICAgfQogICAgaWYgKGltcCl7Y291dDw8MDw8ZW5kbDt9CiAgICBlbHNlIHsKICAgICAgICBjb3V0PDxhbnM8PGVuZGw7CiAgICB9Cn0KaW50IG1haW4oKSB7CiAgICBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsgY2luLnRpZSgwKTsgY291dC50aWUoMCk7CiAgICBsbCB0PTEgOwogICAgY2luID4+dDsKICAgIHdoaWxlICh0LS0pIHsKICAgICAgICBhbnM9MTsKICAgICAgICBzb2x2ZSgpOwogICAgICAgIGltcCA9ZmFsc2U7CiAgICB9Cn0=