#include<bits/stdc++.h>
#define Loop(i,a,b) for(int i=a;i<b;++i)
#define NLoop(i,a,b) for(int i=a;i>=b;--i)
#define print(arr,n,m) for(int i=0;i<n;++i) { for(int j=0;j<m;++j) cout<<arr[i][j]<<" "; cout<<endl; }
#define print2(arr,n) for(int i=0;i<n;++i) { cout<<arr[i]<<" "; } cout<<endl;
#define MOD 998244353
using namespace std;
typedef long long int ll;
/* Iterative Function to calculate (x^y) in O(log y) */
ll power(ll x, ll y, ll p) 
{ 
    ll res = 1;      // Initialize result 
  
    x = x % p;  // Update x if it is more than or  
                // equal to p 
  
    while (y > 0) 
    { 
        // If y is odd, multiply x with result 
        if (y & 1) 
            res = (res*x) % p; 
        y = y>>1; // y = y/2 
        x = (x*x) % p;   
    } 
    return res; 
} 
vector< vector<ll> > G;
ll n,m;
ll mod(ll x)
{
	return x%MOD;
}
bool isBipartite(ll s,vector<ll> &col, vector<bool> &vis, vector<ll> &co, ll last)
{
	vis[s] = true;
	col[s] = last;
	++co[last];
	bool ans = true;
	for(ll i=0;i<G[s].size();++i)
	{
		ll u = G[s][i];
		if(vis[u])
		{
			if(col[u]==col[s]) ans = false;
		}
		else
		{
			ans = ans && isBipartite(u,col,vis,co,1-last);
		}
	}
	return ans;
}
int main()
{
	ios_base::sync_with_stdio(false);
    cin.tie(NULL);
	ll t;
	cin>>t;
	while(t--)
	{
		cin>>n>>m;
		G.clear();
		G.resize(n+1);
		for(ll i=0;i<m;++i)
		{
			ll a,b;
			cin>>a>>b;
			G[a].push_back(b);
			G[b].push_back(a);
		}
		vector<bool> vis(n+1);
		vector<ll> col(n+1,-1);
		ll ans = 1;
		bool fl = false;
		for(ll i=1;i<=n;++i)
		{
			if(!vis[i])
			{
				vector<ll> co(2,0);
				if(isBipartite(i,col,vis,co,0))
				{
					ans = mod(mod(ans) * mod(power(2,co[0],MOD) + power(2,co[1],MOD)));
					fl = true;
				}
			}
		}
		if(fl) cout<<mod(ans)<<endl;
		else cout<<0<<endl;	
	}			
}