```go
package main
import (
"bufio"
"fmt"
"os"
)
const MOD int64 = 1000000007
func modPow(base, exp, mod int64) int64 {
result := int64(1)
base %= mod
for exp > 0 {
if exp&1 == 1 {
result = result * base % mod
}
base = base * base % mod
exp >>= 1
}
return result
}
func main() {
reader := bufio.NewReader(os.Stdin)
writer := bufio.NewWriter(os.Stdout)
defer writer.Flush()
var t int
fmt.Fscan(reader, &t)
for i := 0; i < t; i++ {
var n, m int64
var k int
fmt.Fscan(reader, &n, &m, &k)
totalBoundary := int64(2*(n-2) + 2*(m-2))
boundaryColored := int64(0)
sumColors := int64(0)
for j := 0; j < k; j++ {
var x, y, c int64
fmt.Fscan(reader, &x, &y, &c)
if x == 1 || x == n || y == 1 || y == m {
if !((x == 1 && y == 1) || (x == 1 && y == m) || (x == n && y == 1) || (x == n && y == m)) {
boundaryColored++
sumColors += c
}
}
}
freeBoundary := totalBoundary - boundaryColored
var ans int64
if freeBoundary > 0 {
exp := n*m - int64(k) - 1
ans = modPow(2, exp, MOD)
} else {
if sumColors%2 == 1 {
ans = 0
} else {
exp := n*m - int64(k)
ans = modPow(2, exp, MOD)
}
}
fmt.Fprintln(writer, ans)
}
}
```