import sys from atcoder import dsu from itertools import permutations from bisect import bisect_left, bisect_right import random import math from collections import deque from collections import Counter from collections import defaultdict inf = 1 << 60 sys.setrecursionlimit(10**7) def sgn(x): if x > 0: return 1 elif x == 0: return 0 else: return -1 def popC(x): ans = 0 while x != 0: ans += x % 2 x //= 2 return ans def LI(): return list(map(int, input().split())) def II(): return int(input()) def SI(): return input() n, q = LI() uf = dsu.DSU(n) gr = [[] for _ in range(n)] for _ in range(q): t, a, b = LI() a, b = a-1, b-1 uf.merge(a, b) gr[a].append((b, t)) gr[b].append((a, t)) nowA = [-1] * n def dfs(now, k): if nowA[now] != -1: return nowA[now] == k nowA[now] = k for to, t in gr[now]: if not dfs(to, k ^ t): return False return True for g in uf.groups(): if not dfs(g[0], 0): print(0) exit() print(pow(2, len(uf.groups()), 998244353))