#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e5 + 10;
const ll mod = 998244353;
struct edge{
int v, w, nex;
}e[maxn * 2];
int cnt, head[maxn], fa[maxn], col[maxn];
bool vis[maxn];
set<int> ss;
int n, m;
void add_edge(int u, int v, int w){
cnt++;
e[cnt] = (edge){v, w, head[u]};
head[u] = cnt;
}
int find_fa(int x){
if(x != fa[x]) return fa[x] = find_fa(fa[x]);
return x;
}
void join(int u, int v){
u = find_fa(u); v = find_fa(v);
if(u == v) return ;
fa[u] = v;
}
bool same(int u, int v){
u = find_fa(u); v = find_fa(v); return u == v;
}
void Init(){
for(int i = 1; i <= n; i++) fa[i] = i;
}
ll quick_mod(ll a, int n){
ll sum = 1;
while(n){
if(n & 1) sum = sum * a % mod;
a = a * a % mod;
n >>= 1;
}
return sum;
}
bool dfs(int u, int c){
vis[u] = true; col[u] = c;
for(int i = head[u]; i > 0; i = e[i].nex){
int v = e[i].v;
if(!vis[v] && !dfs(v, col[u] ^ e[i].w)){
return false;
}
if(vis[v] && (col[u] ^ col[v]) != e[i].w) return false;
}
return true;
}
int main(){
scanf("%d%d", &n, &m);
Init();
int u, v, w; int val, tot; tot = 0;
while(m--){
scanf("%d%d%d", &u, &v, &w);
if(w != -1) add_edge(u, v, w), add_edge(v, u, w);
if(!same(u, v)){
join(u, v);
}
}
for(int i = 1; i <= n; i++) ss.insert(find_fa(i));
//val = n - ss.size();///2^(n - 连通块个数)
for(int i = 1; i <= n; i++){
if(!vis[i]){
if(!dfs(i, 0)){
printf("0\n"); return 0;
}
else{
tot++;
}
}
}
val = tot - ss.size();
printf("%lld\n", quick_mod((ll)2, val));
return 0;
}