#include <bits/stdc++.h>
#define ll long long
#define fi first
#define se second
#define pb push_back
#define pli pair<ll, int>
#define float double
using namespace std;
const int ma=3e5+5;
vector <int> g[ma];
ll dp[ma][5];
const int mod=998244353;
int vt[ma];
int sz[ma];
void dfs (int u, int pr) {
vt[u]=1;
for (int v:g[u]) {
if (v==pr) continue;
if (vt[v]) {
if (sz[v]%2==0) continue;
cout << 0;
exit(0);
}
dfs (v, u);
dp[u][1]=(dp[u][1]*dp[v][2])%mod;
dp[u][3]=(dp[u][3]*dp[v][2])%mod;
ll cur=(dp[v][1]%mod + dp[v][3]%mod)%mod;
dp[u][2]=(dp[u][2]*cur)%mod;
sz[u]+=sz[v];
}
vt[u]=2;
}
main () {
ios_base::sync_with_stdio(false);
cin.tie(nullptr); cout.tie(nullptr);
int n, m;
cin >> n >> m;
for (int i=1; i<=m; i++) {
int u, v;
cin >> u >> v;
if (u==v) {
cout << 0;
return 0;
}
g[u].pb(v);
g[v].pb(u);
}
for (int i=1; i<=n; i++) {
sort(g[i].begin(), g[i].end());
g[i].erase (unique(g[i].begin(), g[i].end()), g[i].end());
sz[i]=1;
}
fill (&dp[0][0], &dp[0][0]+ma*5, 1LL);
ll ans=1;
for (int i=1; i<=n; i++) {
if (vt[i]) continue;
dfs (i, 0);
ll sum=(dp[i][1]%mod + dp[i][2]%mod + dp[i][3]%mod)%mod;
//cout << sum << endl;
ans=(ans%mod * sum %mod) %mod;
}
cout << ans;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNkZWZpbmUgbGwgbG9uZyBsb25nCiNkZWZpbmUgZmkgZmlyc3QKI2RlZmluZSBzZSBzZWNvbmQKI2RlZmluZSBwYiBwdXNoX2JhY2sKI2RlZmluZSBwbGkgcGFpcjxsbCwgaW50PgojZGVmaW5lIGZsb2F0IGRvdWJsZQp1c2luZyBuYW1lc3BhY2Ugc3RkOwpjb25zdCBpbnQgbWE9M2U1KzU7CnZlY3RvciA8aW50PiBnW21hXTsKbGwgZHBbbWFdWzVdOwpjb25zdCBpbnQgbW9kPTk5ODI0NDM1MzsKaW50IHZ0W21hXTsKaW50IHN6W21hXTsKCnZvaWQgZGZzIChpbnQgdSwgaW50IHByKSB7CiAgICB2dFt1XT0xOwogICAgZm9yIChpbnQgdjpnW3VdKSB7CiAgICAgICAgaWYgKHY9PXByKSBjb250aW51ZTsKICAgICAgICBpZiAodnRbdl0pIHsKICAgICAgICAgICAgaWYgKHN6W3ZdJTI9PTApIGNvbnRpbnVlOwogICAgICAgICAgICBjb3V0IDw8IDA7CiAgICAgICAgICAgIGV4aXQoMCk7CiAgICAgICAgfQogICAgICAgIGRmcyAodiwgdSk7CiAgICAgICAgZHBbdV1bMV09KGRwW3VdWzFdKmRwW3ZdWzJdKSVtb2Q7CiAgICAgICAgZHBbdV1bM109KGRwW3VdWzNdKmRwW3ZdWzJdKSVtb2Q7CiAgICAgICAgbGwgY3VyPShkcFt2XVsxXSVtb2QgKyBkcFt2XVszXSVtb2QpJW1vZDsKICAgICAgICBkcFt1XVsyXT0oZHBbdV1bMl0qY3VyKSVtb2Q7CiAgICAgICAgc3pbdV0rPXN6W3ZdOwogICAgfQogICAgdnRbdV09MjsKfQoKbWFpbiAoKSB7CiAgICBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsKICAgIGNpbi50aWUobnVsbHB0cik7IGNvdXQudGllKG51bGxwdHIpOwoKICAgIGludCBuLCBtOwogICAgY2luID4+IG4gPj4gbTsKICAgIGZvciAoaW50IGk9MTsgaTw9bTsgaSsrKSB7CiAgICAgICAgaW50IHUsIHY7CiAgICAgICAgY2luID4+IHUgPj4gdjsKICAgICAgICBpZiAodT09dikgewogICAgICAgICAgICBjb3V0IDw8IDA7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICBnW3VdLnBiKHYpOwogICAgICAgIGdbdl0ucGIodSk7CiAgICB9CiAgICBmb3IgKGludCBpPTE7IGk8PW47IGkrKykgewogICAgICAgIHNvcnQoZ1tpXS5iZWdpbigpLCBnW2ldLmVuZCgpKTsKICAgICAgICBnW2ldLmVyYXNlICh1bmlxdWUoZ1tpXS5iZWdpbigpLCBnW2ldLmVuZCgpKSwgZ1tpXS5lbmQoKSk7CiAgICAgICAgc3pbaV09MTsKICAgIH0KICAgIGZpbGwgKCZkcFswXVswXSwgJmRwWzBdWzBdK21hKjUsIDFMTCk7CiAgICBsbCBhbnM9MTsKICAgIGZvciAoaW50IGk9MTsgaTw9bjsgaSsrKSB7CiAgICAgICAgaWYgKHZ0W2ldKSBjb250aW51ZTsKICAgICAgICAgZGZzIChpLCAwKTsKICAgICAgICAgbGwgc3VtPShkcFtpXVsxXSVtb2QgKyBkcFtpXVsyXSVtb2QgKyBkcFtpXVszXSVtb2QpJW1vZDsKICAgICAgICAgLy9jb3V0IDw8IHN1bSA8PCBlbmRsOwogICAgICAgICBhbnM9KGFucyVtb2QgKiBzdW0gJW1vZCkgJW1vZDsKICAgIH0KICAgIGNvdXQgPDwgYW5zOwp9Cg==