← Home
package main

import (
	"bufio"
	"os"
	"strconv"
)

var buffer = make([]byte, 1<<16)
var bufLen int
var bufPtr int

func nextByte() byte {
	if bufPtr >= bufLen {
		bufPtr = 0
		var err error
		bufLen, err = os.Stdin.Read(buffer)
		if bufLen == 0 || err != nil {
			return 0
		}
	}
	b := buffer[bufPtr]
	bufPtr++
	return b
}

func nextInt() int {
	b := nextByte()
	for b <= 32 {
		if b == 0 {
			return 0
		}
		b = nextByte()
	}
	res := 0
	for b > 32 {
		res = res*10 + int(b-'0')
		b = nextByte()
	}
	return res
}

func main() {
	out := bufio.NewWriter(os.Stdout)
	defer out.Flush()

	t := nextInt()
	for tc := 0; tc < t; tc++ {
		n := nextInt()
		m := nextInt()

		type edge struct {
			u, v, w int
		}
		edges := make([]edge, m)
		for i := 0; i < m; i++ {
			edges[i].u = nextInt()
			edges[i].v = nextInt()
			edges[i].w = nextInt()
		}

		ans := (1 << 30) - 1
		parent := make([]int, n+1)

		for bit := 29; bit >= 0; bit-- {
			cand := ans ^ (1 << bit)
			for i := 1; i <= n; i++ {
				parent[i] = i
			}
			comps := n
			for _, e := range edges {
				if (e.w | cand) == cand {
					u, v := e.u, e.v
					for u != parent[u] {
						parent[u] = parent[parent[u]]
						u = parent[u]
					}
					for v != parent[v] {
						parent[v] = parent[parent[v]]
						v = parent[v]
					}
					if u != v {
						parent[u] = v
						comps--
						if comps == 1 {
							break
						}
					}
				}
			}
			if comps == 1 {
				ans = cand
			}
		}
		out.WriteString(strconv.Itoa(ans) + "\n")
	}
}