package main
import (
"bufio"
"os"
"strconv"
)
func main() {
scanner := bufio.NewScanner(os.Stdin)
scanner.Split(bufio.ScanWords)
writer := bufio.NewWriter(os.Stdout)
defer writer.Flush()
nextInt := func() int {
scanner.Scan()
val, _ := strconv.Atoi(scanner.Text())
return val
}
scanner.Scan()
tStr := scanner.Text()
if tStr == "" {
return
}
t, _ := strconv.Atoi(tStr)
for i := 0; i < t; i++ {
solve(nextInt, writer)
}
}
func solve(nextInt func() int, writer *bufio.Writer) {
n := nextInt()
q := nextInt()
b := make([]int, n)
for i := 0; i < n; i++ {
b[i] = nextInt()
}
type op struct {
x, y, z int
}
ops := make([]op, q)
for i := 0; i < q; i++ {
ops[i] = op{
x: nextInt() - 1,
y: nextInt() - 1,
z: nextInt() - 1,
}
}
d := make([]int, n)
copy(d, b)
for i := q - 1; i >= 0; i-- {
o := ops[i]
req := d[o.z]
d[o.z] = 0
if req > d[o.x] {
d[o.x] = req
}
if req > d[o.y] {
d[o.y] = req
}
}
sim := make([]int, n)
copy(sim, d)
for i := 0; i < q; i++ {
o := ops[i]
valX := sim[o.x]
valY := sim[o.y]
minVal := valX
if valY < minVal {
minVal = valY
}
sim[o.z] = minVal
}
possible := true
for i := 0; i < n; i++ {
if sim[i] != b[i] {
possible = false
break
}
}
if possible {
for i := 0; i < n; i++ {
if i > 0 {
writer.WriteByte(' ')
}
writer.WriteString(strconv.Itoa(d[i]))
}
writer.WriteByte('\n')
} else {
writer.WriteString("-1\n")
}
}