← Home
package main

import (
	"bufio"
	"fmt"
	"os"
)

type Node struct {
	adj      []int
	parent   int
	children []int
	in, out  int
}

func main() {
	reader := bufio.NewReader(os.Stdin)
	var t int
	if _, err := fmt.Fscan(reader, &t); err != nil {
		return
	}
	for i := 0; i < t; i++ {
		solve(reader)
	}
}

func solve(reader *bufio.Reader) {
	var n int
	fmt.Fscan(reader, &n)

	nodes := make([]Node, n+1)
	for i := 1; i <= n; i++ {
		nodes[i].adj = make([]int, 0)
		nodes[i].children = make([]int, 0)
	}

	for i := 0; i < n-1; i++ {
		var u, v int
		fmt.Fscan(reader, &u, &v)
		nodes[u].adj = append(nodes[u].adj, v)
		nodes[v].adj = append(nodes[v].adj, u)
	}

	if n == 1 {
		fmt.Println("! 1")
		return
	}

	timer := 0
	var dfs func(int, int)
	dfs = func(u, p int) {
		timer++
		nodes[u].in = timer
		nodes[u].parent = p
		for _, v := range nodes[u].adj {
			if v != p {
				nodes[u].children = append(nodes[u].children, v)
				dfs(v, u)
			}
		}
		nodes[u].out = timer
	}

	dfs(1, 0)
	nodes[1].parent = 1

	S := make([]int, 0, n)
	in_S := make([]bool, n+1)
	for i := 1; i <= n; i++ {
		S = append(S, i)
		in_S[i] = true
	}

	inSubtree := func(x, v int) bool {
		return nodes[v].in <= nodes[x].in && nodes[x].in <= nodes[v].out
	}

	total_in_S := make([]int, n+1)
	C_in := make([]int, n+1)
	S_1 := make([]int, n+1)

	for len(S) > 1 {
		for i := 0; i <= n; i++ {
			total_in_S[i] = 0
			C_in[i] = 0
			S_1[i] = 0
		}

		for _, x := range S {
			total_in_S[nodes[x].parent]++
		}

		C := 0
		for i := 1; i <= n; i++ {
			if total_in_S[i] > 0 {
				C++
			}
		}

		var compute func(int)
		compute = func(u int) {
			if total_in_S[u] > 0 {
				C_in[u] = 1
			}
			if in_S[u] {
				S_1[u] = 1
			}
			for _, v := range nodes[u].children {
				compute(v)
				C_in[u] += C_in[v]
				S_1[u] += S_1[v]
			}
		}
		compute(1)

		best_v := -1
		best_score := n + 2
		best_tie := n + 2

		for v := 2; v <= n; v++ {
			val := 0
			if in_S[v] && total_in_S[nodes[v].parent] == 1 {
				val = 1
			}
			S_0_v := C - C_in[v] - val
			score := S_1[v]
			if S_0_v > score {
				score = S_0_v
			}
			tie := S_1[v] + S_0_v

			if score < best_score || (score == best_score && tie < best_tie) {
				best_score = score
				best_tie = tie
				best_v = v
			}
		}

		fmt.Printf("? %d\n", best_v)
		var ans int
		fmt.Fscan(reader, &ans)

		new_S := make([]int, 0)
		new_in_S := make([]bool, n+1)

		if ans == 1 {
			for _, x := range S {
				if inSubtree(x, best_v) {
					new_S = append(new_S, x)
					new_in_S[x] = true
				}
			}
		} else {
			for _, x := range S {
				if !inSubtree(x, best_v) {
					p := nodes[x].parent
					if !new_in_S[p] {
						new_S = append(new_S, p)
						new_in_S[p] = true
					}
				}
			}
		}
		S = new_S
		in_S = new_in_S
	}

	fmt.Printf("! %d\n", S[0])
}