← Home
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")
	}
}