← Home
package main

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

type Node struct {
	L, R uint32
	val  uint64
}

var (
	tree    []Node
	nodeCnt uint32
	R_arr   [100005]uint64
	up      [100005][18]int
	depth   [100005]int
	root    [100005]uint32
	adj     [][]int
	a       []int
	ans     []int
)

func init() {
	seed := uint64(88172645463325252)
	for i := 1; i <= 100000; i++ {
		seed ^= seed << 13
		seed ^= seed >> 7
		seed ^= seed << 17
		R_arr[i] = seed
	}
}

func insert(prev uint32, L, R, c int) uint32 {
	nodeCnt++
	curr := nodeCnt
	tree[curr] = tree[prev]
	tree[curr].val += R_arr[c]
	if L == R {
		return curr
	}
	mid := (L + R) / 2
	if c <= mid {
		tree[curr].L = insert(tree[prev].L, L, mid, c)
	} else {
		tree[curr].R = insert(tree[prev].R, mid+1, R, c)
	}
	return curr
}

func dfs(u, p, d int) {
	up[u][0] = p
	depth[u] = d
	root[u] = insert(root[p], 1, 100000, a[u])
	for i := 1; i < 18; i++ {
		up[u][i] = up[up[u][i-1]][i-1]
	}
	for _, v := range adj[u] {
		if v != p {
			dfs(v, u, d+1)
		}
	}
}

func lca(u, v int) int {
	if depth[u] < depth[v] {
		u, v = v, u
	}
	diff := depth[u] - depth[v]
	for i := 0; i < 18; i++ {
		if (diff & (1 << i)) != 0 {
			u = up[u][i]
		}
	}
	if u == v {
		return u
	}
	for i := 17; i >= 0; i-- {
		if up[u][i] != up[v][i] {
			u = up[u][i]
			v = up[v][i]
		}
	}
	return up[u][0]
}

func dfs_seg(n1, n2, n3, n4, m1, m2, m3, m4 uint32, L, R, k int) {
	if len(ans) == k {
		return
	}
	val1 := tree[n1].val + tree[n2].val - tree[n3].val - tree[n4].val
	val2 := tree[m1].val + tree[m2].val - tree[m3].val - tree[m4].val
	if val1 == val2 {
		return
	}
	if L == R {
		ans = append(ans, L)
		return
	}
	mid := (L + R) / 2
	dfs_seg(tree[n1].L, tree[n2].L, tree[n3].L, tree[n4].L, tree[m1].L, tree[m2].L, tree[m3].L, tree[m4].L, L, mid, k)
	if len(ans) < k {
		dfs_seg(tree[n1].R, tree[n2].R, tree[n3].R, tree[n4].R, tree[m1].R, tree[m2].R, tree[m3].R, tree[m4].R, mid+1, R, k)
	}
}

func main() {
	scanner := bufio.NewScanner(os.Stdin)
	scanner.Split(bufio.ScanWords)
	scanner.Buffer(make([]byte, 1024*1024), 1024*1024*10)

	scanInt := func() int {
		scanner.Scan()
		res := 0
		for _, b := range scanner.Bytes() {
			res = res*10 + int(b-'0')
		}
		return res
	}

	if !scanner.Scan() {
		return
	}
	res := 0
	for _, b := range scanner.Bytes() {
		res = res*10 + int(b-'0')
	}
	n := res

	a = make([]int, n+1)
	for i := 1; i <= n; i++ {
		a[i] = scanInt()
	}

	adj = make([][]int, n+1)
	for i := 0; i < n-1; i++ {
		u := scanInt()
		v := scanInt()
		adj[u] = append(adj[u], v)
		adj[v] = append(adj[v], u)
	}

	tree = make([]Node, n*40+100000)
	nodeCnt = 0

	dfs(1, 0, 1)

	q := scanInt()
	out := bufio.NewWriter(os.Stdout)
	defer out.Flush()

	for i := 0; i < q; i++ {
		u1 := scanInt()
		v1 := scanInt()
		u2 := scanInt()
		v2 := scanInt()
		k := scanInt()

		lca1 := lca(u1, v1)
		plca1 := up[lca1][0]
		lca2 := lca(u2, v2)
		plca2 := up[lca2][0]

		ans = ans[:0]
		dfs_seg(root[u1], root[v1], root[lca1], root[plca1], root[u2], root[v2], root[lca2], root[plca2], 1, 100000, k)

		fmt.Fprintf(out, "%d", len(ans))
		for _, v := range ans {
			fmt.Fprintf(out, " %d", v)
		}
		fmt.Fprintln(out)
	}
}