n, q = map(int, input().split()) uf = [-1]*(2*n) def root(a): if uf[a] < 0: return a uf[a] = root(uf[a]) return uf[a] def same(a, b): return root(a) == root(b) def merge(a, b): if same(a, b): return a = root(a) b = root(b) if uf[b] < uf[a]: a, b = b, a uf[a] += uf[b] uf[b] = a def sizeof(a): return -uf[a] mod = 998244353 for _ in range(q): a, b, c = map(int, input().split()) # 各人 2頂点用意する  # A B 0 のとき A0->B0, A1->B1に辺 # A B 1 のとき A0->B1, A1->B0に辺 # やって、A0とA1が同じ頂点で矛盾 (A0と仮定してA1が導かれるのが矛盾) a -= 1 b -= 1 if c == 0: merge(a, b) merge(a + n, b + n) else: merge(a, b + n) merge(a + n, b) if same(a, a + n): print(0) else: ch = [0] * (n * 2) ans = 1 for i in range(n): r0 = root(i) r1 = root(i + n) if ch[r0] > 0 or ch[r1] > 0: continue ch[r0] = 1 ch[r1] = 1 ans = ans * 2 % mod print(ans)