← Home
package main

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

type FastScanner struct {
	data []byte
	idx  int
	n    int
}

func NewFastScanner() *FastScanner {
	data, _ := io.ReadAll(os.Stdin)
	return &FastScanner{data: data, n: len(data)}
}

func (fs *FastScanner) NextInt() int {
	for fs.idx < fs.n {
		b := fs.data[fs.idx]
		if b != ' ' && b != '\n' && b != '\r' && b != '\t' {
			break
		}
		fs.idx++
	}
	sign := 1
	if fs.idx < fs.n && fs.data[fs.idx] == '-' {
		sign = -1
		fs.idx++
	}
	val := 0
	for fs.idx < fs.n {
		b := fs.data[fs.idx]
		if b < '0' || b > '9' {
			break
		}
		val = val*10 + int(b-'0')
		fs.idx++
	}
	return sign * val
}

func modPow2(exp, mod int64) int64 {
	res := int64(1 % mod)
	base := int64(2 % mod)
	for exp > 0 {
		if exp&1 == 1 {
			res = res * base % mod
		}
		base = base * base % mod
		exp >>= 1
	}
	return res
}

func main() {
	fs := NewFastScanner()
	n := fs.NextInt()
	m := fs.NextInt()
	k := fs.NextInt()

	rowCnt := make([]int, n)
	colCnt := make([]int, m)
	rowPar := make([]int, n)
	colPar := make([]int, m)

	for i := 0; i < k; i++ {
		a := fs.NextInt() - 1
		b := fs.NextInt() - 1
		c := fs.NextInt()
		bit := 0
		if c == -1 {
			bit = 1
		}
		rowCnt[a]++
		colCnt[b]++
		rowPar[a] ^= bit
		colPar[b] ^= bit
	}

	p := int64(fs.NextInt())
	out := bufio.NewWriter(os.Stdout)
	defer out.Flush()

	if (n&1) != (m&1) {
		fmt.Fprint(out, 0)
		return
	}

	ir, ic := 0, 0

	for i := 0; i < n; i++ {
		if rowCnt[i] == m {
			ir++
			if rowPar[i] != 1 {
				fmt.Fprint(out, 0)
				return
			}
		}
	}

	for j := 0; j < m; j++ {
		if colCnt[j] == n {
			ic++
			if colPar[j] != 1 {
				fmt.Fprint(out, 0)
				return
			}
		}
	}

	exp := int64(n)*int64(m) - int64(k) - int64(n) - int64(m) + int64(ir) + int64(ic) + 1
	fmt.Fprint(out, modPow2(exp, p))
}