#include <bits/stdc++.h>
#define ll long long int
#define MOD 998244353
using namespace std;
ll fast_pow(ll base,ll exp){if (exp == 0) return 1;if (exp == 1) return base % MOD;ll t = fast_pow(base, exp / 2);t = ((t% MOD) * (t%MOD)) % MOD;if (exp % 2 == 0)return t;else return ((base % MOD) * t) % MOD;}
bool impossible = false;
template <typename T>
class Graph
{
//map<source, vector<destinations>>
map<T,std::vector<T> >adjList;
public :
Graph()
{
}
ll netv;
void setnetv(ll n)
{
netv = n;
}
void addEdge(T source, T destination, bool bidr = true)
{
adjList[source].push_back(destination);
if(bidr)
adjList[destination].push_back(source);
}
void printAdjList()
{
for(auto i: adjList)
{
cout << i.first << "->";
for(auto entry: i.second)
cout << entry << ", ";
cout << endl;
}
}
ll getrepv()
{
return adjList.size();
}
bool bfs(T src, map<T, bool > &visited, pair<ll, ll > &n_nodes,map<T, bool > &color)
{
queue<T> q ;
bool col = false;
color[src] = col;
n_nodes.first++;
visited[src] = true;
for(auto neighbour : adjList[src])
{
color[neighbour] = !color[src];
n_nodes.second++;
visited[neighbour] = true;
q.push(neighbour);
}
while(!q.empty())
{
T top = q.front();
q.pop();
for(auto neighbour : adjList[top])
{
if(!visited[neighbour])
{
q.push(neighbour);
visited[neighbour] = true;
color[neighbour] = !color[top];
if(color[neighbour] == false)
n_nodes.first++;
else if(color[neighbour] == true)
n_nodes.second++;
}
else if(color[neighbour] == color[top])
{
impossible = true;
return false;
}
}
}
return true;
}
void biPartitie(vector<pair<ll, ll>> &nv)
{
pair<ll,ll> n_nodes;
n_nodes.first = 0;
n_nodes.second = 0;
map<T, bool > visited;
map<T, bool > color;
for(auto i : adjList)
{
T src = i.first;
if(!visited[src])
{
if(bfs(src,visited,n_nodes,color) == true)
nv.push_back(n_nodes);
if(impossible)
return;
}
n_nodes.first = 0;
n_nodes.second = 0;
}
return;
}
};
int main()
{
ll t;
cin >> t;
while(t--)
{
Graph<ll> g;
ll v, e;
cin >> v >> e;
g.setnetv(v);
for(ll i = 0; i < e; i++)
{
ll u, v;
cin >> u >> v;
g.addEdge(u, v);
}
ll freever = v - g.getrepv();
//ansfromfreevert is answer from vertices which are not connected to any other vertice and are not in the adjacency list
ll ansfromfreevert = fast_pow(3,freever);
std::vector<pair<ll,ll>> nv;
g.biPartitie(nv);
ll ans = 1;
for(auto p : nv)
{
ll p1 = p.first;
ll p2 = p.second;
ans = ((fast_pow(2,p1)%MOD + fast_pow(2,p2)%MOD))%MOD;
ans = ans % MOD;
}
//multiplying ansfromfreevert as ans doesnt consider vertices which are not in adjacency list
ans = ((ans % MOD) * ansfromfreevert) % MOD;
ans = ans % MOD;
if(impossible)
cout << 0 << endl;
else
cout << ans << endl;
//again initialize impossible by false for next testcase
impossible = false;
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNkZWZpbmUgbGwgbG9uZyBsb25nIGludAojZGVmaW5lIE1PRCA5OTgyNDQzNTMKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKbGwgZmFzdF9wb3cobGwgYmFzZSxsbCBleHApe2lmIChleHAgPT0gMCkgcmV0dXJuIDE7aWYgKGV4cCA9PSAxKSByZXR1cm4gYmFzZSAlIE1PRDtsbCB0ID0gZmFzdF9wb3coYmFzZSwgZXhwIC8gMik7dCA9ICgodCUgTU9EKSAqICh0JU1PRCkpICUgTU9EO2lmIChleHAgJSAyID09IDApcmV0dXJuIHQ7ZWxzZSByZXR1cm4gKChiYXNlICUgIE1PRCkgKiB0KSAlIE1PRDt9CmJvb2wgaW1wb3NzaWJsZSA9IGZhbHNlOwp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KY2xhc3MgR3JhcGgKewogICAgLy9tYXA8c291cmNlLCB2ZWN0b3I8ZGVzdGluYXRpb25zPj4KICAgIG1hcDxULHN0ZDo6dmVjdG9yPFQ+ID5hZGpMaXN0OwogICAgcHVibGljIDogCiAgICBHcmFwaCgpCiAgICB7CiAKICAgIH0KICAgIGxsIG5ldHY7CiAgICB2b2lkIHNldG5ldHYobGwgbikKICAgIHsKICAgICAgICBuZXR2ID0gbjsKICAgIH0KICAgIHZvaWQgYWRkRWRnZShUIHNvdXJjZSwgVCBkZXN0aW5hdGlvbiwgYm9vbCBiaWRyID0gdHJ1ZSkKICAgIHsKICAgICAgICBhZGpMaXN0W3NvdXJjZV0ucHVzaF9iYWNrKGRlc3RpbmF0aW9uKTsKICAgICAgICBpZihiaWRyKQogICAgICAgICAgICBhZGpMaXN0W2Rlc3RpbmF0aW9uXS5wdXNoX2JhY2soc291cmNlKTsKICAgIH0KIAogICAgdm9pZCBwcmludEFkakxpc3QoKQogICAgewogICAgICAgIGZvcihhdXRvIGk6IGFkakxpc3QpCiAgICAgICAgewogICAgICAgICAgICBjb3V0IDw8IGkuZmlyc3QgPDwgIi0+IjsKICAgICAgICAgICAgZm9yKGF1dG8gZW50cnk6IGkuc2Vjb25kKQogICAgICAgICAgICAgICAgY291dCA8PCBlbnRyeSA8PCAiLCAiOwogICAgICAgICAgICBjb3V0IDw8IGVuZGw7CiAgICAgICAgfQogICAgfQogICAgbGwgZ2V0cmVwdigpCiAgICB7CiAgICAgICAgcmV0dXJuIGFkakxpc3Quc2l6ZSgpOwogICAgfQogICAgYm9vbCBiZnMoVCBzcmMsIG1hcDxULCBib29sID4gJnZpc2l0ZWQsIHBhaXI8bGwsIGxsID4gJm5fbm9kZXMsbWFwPFQsIGJvb2wgPiAmY29sb3IpCiAgICB7CiAgICAgICAgcXVldWU8VD4gcSA7CiAgICAgICAgYm9vbCBjb2wgPSBmYWxzZTsKICAgICAgICBjb2xvcltzcmNdID0gY29sOwogICAgICAgIG5fbm9kZXMuZmlyc3QrKzsKICAgICAgICB2aXNpdGVkW3NyY10gPSB0cnVlOwogICAgICAgIGZvcihhdXRvIG5laWdoYm91ciA6IGFkakxpc3Rbc3JjXSkKICAgICAgICB7CiAgICAgICAgICAgIGNvbG9yW25laWdoYm91cl0gPSAhY29sb3Jbc3JjXTsKICAgICAgICAgICAgbl9ub2Rlcy5zZWNvbmQrKzsKICAgICAgICAgICAgdmlzaXRlZFtuZWlnaGJvdXJdID0gdHJ1ZTsKICAgICAgICAgICAgcS5wdXNoKG5laWdoYm91cik7CiAgICAgICAgfQogICAgICAgIHdoaWxlKCFxLmVtcHR5KCkpCiAgICAgICAgewogICAgICAgICAgICBUIHRvcCA9IHEuZnJvbnQoKTsKICAgICAgICAgICAgcS5wb3AoKTsKICAgICAgICAgICAgZm9yKGF1dG8gbmVpZ2hib3VyIDogYWRqTGlzdFt0b3BdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZighdmlzaXRlZFtuZWlnaGJvdXJdKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHEucHVzaChuZWlnaGJvdXIpOwogICAgICAgICAgICAgICAgICAgIHZpc2l0ZWRbbmVpZ2hib3VyXSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgY29sb3JbbmVpZ2hib3VyXSA9ICFjb2xvclt0b3BdOwogICAgICAgICAgICAgICAgICAgIGlmKGNvbG9yW25laWdoYm91cl0gPT0gZmFsc2UpCiAgICAgICAgICAgICAgICAgICAgICAgIG5fbm9kZXMuZmlyc3QrKzsKICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKGNvbG9yW25laWdoYm91cl0gPT0gdHJ1ZSkKICAgICAgICAgICAgICAgICAgICAgICAgbl9ub2Rlcy5zZWNvbmQrKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYoY29sb3JbbmVpZ2hib3VyXSA9PSBjb2xvclt0b3BdKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGltcG9zc2libGUgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHZvaWQgYmlQYXJ0aXRpZSh2ZWN0b3I8cGFpcjxsbCwgbGw+PiAmbnYpCiAgICB7CiAgICAgICAgcGFpcjxsbCxsbD4gbl9ub2RlczsKICAgICAgICBuX25vZGVzLmZpcnN0ID0gMDsKICAgICAgICBuX25vZGVzLnNlY29uZCA9IDA7CiAgICAgICAgbWFwPFQsIGJvb2wgPiB2aXNpdGVkOwogICAgICAgIG1hcDxULCBib29sID4gY29sb3I7CiAgICAgICAgZm9yKGF1dG8gaSA6IGFkakxpc3QpCiAgICAgICAgewogICAgICAgICAgICBUIHNyYyA9IGkuZmlyc3Q7CiAgICAgICAgICAgIGlmKCF2aXNpdGVkW3NyY10pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmKGJmcyhzcmMsdmlzaXRlZCxuX25vZGVzLGNvbG9yKSA9PSB0cnVlKQogICAgICAgICAgICAgICAgICAgIG52LnB1c2hfYmFjayhuX25vZGVzKTsKICAgICAgICAgICAgICAgIGlmKGltcG9zc2libGUpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG5fbm9kZXMuZmlyc3QgPSAwOwogICAgICAgICAgICBuX25vZGVzLnNlY29uZCA9IDA7CiAgICAgICAgfQogICAgICAgIHJldHVybjsKICAgIH0KfTsKIAppbnQgbWFpbigpICAKewogICAgbGwgdDsKICAgIGNpbiA+PiB0OwogICAgd2hpbGUodC0tKQogICAgewogICAgICAgIEdyYXBoPGxsPiBnOwogICAgICAgIGxsIHYsIGU7CiAgICAgICAgY2luID4+IHYgPj4gZTsKICAgICAgICBnLnNldG5ldHYodik7CiAKICAgICAgICBmb3IobGwgaSA9IDA7IGkgPCBlOyBpKyspCiAgICAgICAgewogICAgICAgICAgICBsbCB1LCB2OwogICAgICAgICAgICBjaW4gPj4gdSA+PiB2OwogICAgICAgICAgICBnLmFkZEVkZ2UodSwgdik7CiAgICAgICAgfQogICAgICAgIGxsIGZyZWV2ZXIgPSB2IC0gZy5nZXRyZXB2KCk7CiAgICAgICAgLy9hbnNmcm9tZnJlZXZlcnQgaXMgYW5zd2VyIGZyb20gdmVydGljZXMgd2hpY2ggYXJlIG5vdCBjb25uZWN0ZWQgdG8gYW55IG90aGVyIHZlcnRpY2UgYW5kIGFyZSBub3QgaW4gdGhlIGFkamFjZW5jeSBsaXN0CiAgICAgICAgbGwgYW5zZnJvbWZyZWV2ZXJ0ID0gZmFzdF9wb3coMyxmcmVldmVyKTsKICAgICAgICBzdGQ6OnZlY3RvcjxwYWlyPGxsLGxsPj4gbnY7CiAgICAgICAgZy5iaVBhcnRpdGllKG52KTsKICAgICAgICBsbCBhbnMgPSAxOwogICAgICAgIGZvcihhdXRvIHAgOiBudikKICAgICAgICB7CiAgICAgICAgICAgIGxsIHAxID0gcC5maXJzdDsKICAgICAgICAgICAgbGwgcDIgPSBwLnNlY29uZDsKICAgICAgICAgICAgYW5zID0gKChmYXN0X3BvdygyLHAxKSVNT0QgKyBmYXN0X3BvdygyLHAyKSVNT0QpKSVNT0Q7CiAgICAgICAgICAgIGFucyA9IGFucyAlIE1PRDsKICAgICAgICB9CgogICAgICAgIC8vbXVsdGlwbHlpbmcgYW5zZnJvbWZyZWV2ZXJ0IGFzIGFucyBkb2VzbnQgY29uc2lkZXIgdmVydGljZXMgd2hpY2ggYXJlIG5vdCBpbiBhZGphY2VuY3kgbGlzdAogICAgICAgIGFucyA9ICgoYW5zICUgTU9EKSAqICBhbnNmcm9tZnJlZXZlcnQpICUgTU9EOwogICAgICAgIGFucyA9IGFucyAlIE1PRDsKICAgICAgICBpZihpbXBvc3NpYmxlKQogICAgICAgICAgICBjb3V0IDw8IDAgPDwgZW5kbDsKICAgICAgICBlbHNlCiAgICAgICAgICAgIGNvdXQgPDwgYW5zIDw8IGVuZGw7CgogICAgICAgIC8vYWdhaW4gaW5pdGlhbGl6ZSBpbXBvc3NpYmxlIGJ5IGZhbHNlIGZvciBuZXh0IHRlc3RjYXNlCiAgICAgICAgaW1wb3NzaWJsZSA9IGZhbHNlOwogICAgfQogICAgcmV0dXJuIDA7Cn0=
MTIKOCA3CjIgMwozIDQKNCA1CjUgMgo2IDcKNyA4CjggNgoxIDAKMiAxCjEgMgozIDMKMSAyCjIgMwoxIDMKMyAyCjIgMwozIDEKNCA0CjEgMgoyIDMKMyA0CjQgMQo0IDQKMSAyCjIgMwozIDEKNCAxCjYgOQoxIDQKMSA1CjEgNgoyIDQKMiA1CjIgNgozIDQKMyA1CjMgNgoxMDAwMDAgMAoxMDAwIDUKNTUgNTYKNTYgNTcKNTcgNTgKNTggNTkKNTkgNTUKMTEgMTEKMSAyCjIgMwozIDQKNCA1CjUgNgo2IDcKNyA4CjggOQo5IDEwCjEwIDExCjExIDEKMTAgMTIKMSAyCjIgMwozIDQKNCAxCjEgNQo1IDYKNiA3CjcgMQoxIDgKOCA5CjkgMTAKMTAgMQ==
12
8 7
2 3
3 4
4 5
5 2
6 7
7 8
8 6
1 0
2 1
1 2
3 3
1 2
2 3
1 3
3 2
2 3
3 1
4 4
1 2
2 3
3 4
4 1
4 4
1 2
2 3
3 1
4 1
6 9
1 4
1 5
1 6
2 4
2 5
2 6
3 4
3 5
3 6
100000 0
1000 5
55 56
56 57
57 58
58 59
59 55
11 11
1 2
2 3
3 4
4 5
5 6
6 7
7 8
8 9
9 10
10 11
11 1
10 12
1 2
2 3
3 4
4 1
1 5
5 6
6 7
7 1
1 8
8 9
9 10
10 1