← Home
package main

import (
	"bufio"
	"fmt"
	"os"
)

const MOD = 998244353

var fact, invFact []int64

func power(base, exp int64) int64 {
	res := int64(1)
	base %= MOD
	for exp > 0 {
		if exp%2 == 1 {
			res = (res * base) % MOD
		}
		base = (base * base) % MOD
		exp /= 2
	}
	return res
}

func precompute(maxN int) {
	fact = make([]int64, maxN+1)
	invFact = make([]int64, maxN+1)
	fact[0] = 1
	invFact[0] = 1
	for i := 1; i <= maxN; i++ {
		fact[i] = (fact[i-1] * int64(i)) % MOD
	}
	invFact[maxN] = power(fact[maxN], MOD-2)
	for i := maxN - 1; i >= 1; i-- {
		invFact[i] = (invFact[i+1] * int64(i+1)) % MOD
	}
}

func nCr(n, r int) int64 {
	if r < 0 || r > n {
		return 0
	}
	num := fact[n]
	den := (invFact[r] * invFact[n-r]) % MOD
	return (num * den) % MOD
}

func main() {
	precompute(1000000)

	in := bufio.NewReader(os.Stdin)
	out := bufio.NewWriter(os.Stdout)
	defer out.Flush()

	var t int
	if _, err := fmt.Fscan(in, &t); err != nil {
		return
	}

	for tc := 0; tc < t; tc++ {
		var n, m, v int
		fmt.Fscan(in, &n, &m, &v)

		total_matrices := power(power(int64(v), int64(n)), int64(m))

		sum_Ekk := int64(0)
		v_n := power(int64(v), int64(n))
		v_m := power(int64(v), int64(m))
		v_nm := total_matrices

		for k := 1; k < v; k++ {
			term1_base := (v_n - power(int64(v-k), int64(n)) + MOD) % MOD
			term1 := power(term1_base, int64(m))

			term2_base := (v_m - power(int64(k), int64(m)) + MOD) % MOD
			term2 := power(term2_base, int64(n))

			Ekk := (term1 + term2) % MOD
			Ekk = (Ekk - v_nm + MOD) % MOD

			sum_Ekk = (sum_Ekk + Ekk) % MOD
		}

		sum_Ekk1 := int64(0)

		if v > 2 {
			pow_v := make([]int64, n+1)
			pow_v[0] = 1
			for j := 1; j <= n; j++ {
				pow_v[j] = (pow_v[j-1] * int64(v)) % MOD
			}

			pow_vk := make([]int64, n+1)
			for k := 1; k < v-1; k++ {
				pow_vk[0] = 1
				vk := int64(v - k)
				for j := 1; j <= n; j++ {
					pow_vk[j] = (pow_vk[j-1] * vk) % MOD
				}

				Ekk1 := int64(0)
				pow_k1 := int64(1)
				for i := 0; i <= n; i++ {
					part1 := (pow_k1 * pow_v[n-i]) % MOD
					part2 := pow_vk[n-i]

					inner := (part1 - part2 + MOD) % MOD
					term := power(inner, int64(m))
					term = (term * nCr(n, i)) % MOD

					if i%2 == 1 {
						Ekk1 = (Ekk1 - term + MOD) % MOD
					} else {
						Ekk1 = (Ekk1 + term) % MOD
					}

					pow_k1 = (pow_k1 * int64(k+1)) % MOD
				}
				sum_Ekk1 = (sum_Ekk1 + Ekk1) % MOD
			}
		}

		union_size := (sum_Ekk - sum_Ekk1 + MOD) % MOD
		ans := (total_matrices - union_size + MOD) % MOD

		fmt.Fprintln(out, ans)
	}
}