package main import ( "bufio" "fmt" "os" "strconv" "strings" ) const mod = 998244353 var fa [4000005]int func main() { scanner := bufio.NewScanner(os.Stdin) scanner.Scan() raw := strings.Split(scanner.Text(), " ") n, _ := strconv.Atoi(raw[0]) m, _ := strconv.Atoi(raw[1]) for i := 1; i <= n; i++ { fa[i] = i } ans := 0 for i := 1; i <= m; i++ { scanner.Scan() raw := strings.Split(scanner.Text(), " ") op, _ := strconv.Atoi(raw[0]) u, _ := strconv.Atoi(raw[1]) v, _ := strconv.Atoi(raw[2]) if op == 0 { merge(u, v) } else { // op == 1 ans <<= 1 ans |= bool2int(find(u) == find(v)) ans %= mod } } fmt.Println(ans) } func find(x int) int { if fa[x] == x { return x } fa[x] = find(fa[x]) return fa[x] } func merge(x int, y int) { fa[find(x)] = find(y) } func bool2int(x bool) int { if x { return 1 } return 0 }