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))
}