#include <bits/stdc++.h>
using namespace std;
int n, m, t, k, a, b, k1, k2;
long long odp, mod = 998244353;
vector<int> pol[300005];
int kol[300005];
bool czy[300005];
bool wyn;
long long pot(int wyk) {
  long long pod = 2;
  long long ile = 1;
  while (wyk > 0) {
    if (wyk % 2 == 1) ile = (ile * pod) % mod;
    pod = (pod * pod) % mod;
    wyk = wyk / 2;
  }
  return ile;
}
void dfs(int v, int ko) {
  kol[v] = ko;
  if (ko == 1)
    k1++;
  else
    k2++;
  czy[v] = true;
  for (int i = 0; i < pol[v].size(); i++) {
    if (kol[pol[v][i]] == ko) {
      wyn = false;
      return;
    }
    if (czy[pol[v][i]] == false) {
      czy[pol[v][i]] = true;
      if (ko == 1)
        dfs(pol[v][i], 2);
      else
        dfs(pol[v][i], 1);
    }
  }
  return;
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  cin >> t;
  for (int z = 0; z < t; z++) {
    cin >> n >> m;
    wyn = true;
    k1 = 0;
    k2 = 0;
    odp = 1;
    for (int i = 0; i < m; i++) {
      cin >> a >> b;
      pol[a + k].push_back(b + k);
      pol[b + k].push_back(a + k);
    }
    for (int i = 1 + k; i < n + 1 + k; i++) {
      if (czy[i] == false) {
        dfs(i, 1);
        odp = (odp * ((pot(k1) + pot(k2)) % mod)) % mod;
        k1 = 0;
        k2 = 0;
      }
      if (wyn == false) break;
    }
    if (wyn == false)
      cout << "0\n";
    else
      cout << odp << "\n";
    k = k + n;
  }
  return 0;
}
