local n, q = io.read("*n", "*n") local asked = {} local parent = {} local edge = {} local flag = {} for i = 1, n do asked[i] = false parent[i] = i edge[i] = {} flag[i] = 0 end local function uf_findroot(idx) local idx_update = idx while parent[idx] ~= idx do idx = parent[idx] end while parent[idx_update] ~= idx do parent[idx_update], idx_update = idx, parent[idx_update] end return idx end local a, b, c = {}, {}, {} for iq = 1, q do local ai, bi, ci = io.read("*n", "*n", "*n") a[iq], b[iq], c[iq] = ai, bi, ci table.insert(edge[ai], iq) table.insert(edge[bi], iq) local ar, br = uf_findroot(ai), uf_findroot(bi) if ar ~= br then parent[bi], parent[br] = ar, ar end end local gmap = {} for i = 1, n do local r = uf_findroot(i) gmap[r] = true end local function check(spos) asked[spos] = true local tasks = {spos} local done = 0 while done < #tasks do done = done + 1 local src = tasks[done] for i = 1, #edge[src] do local ei = edge[src][i] local dst = a[ei] + b[ei] - src local ci = c[ei] if asked[dst] then if ci == 0 then if flag[dst] ~= flag[src] then return false end else if flag[dst] == flag[src] then return false end end else asked[dst] = true if ci == 0 then flag[dst] = flag[src] else flag[dst] = 1 - flag[src] end table.insert(tasks, dst) end end end return true end local ans = 1 for key, val in pairs(gmap) do if check(key) then ans = (ans + ans) % 998244353 else print(0) os.exit() end end print(ans)