← Home
package main

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

type Edge struct {
	u, v, id int
	w        int64
}

var (
	in    []int
	out   []int
	adj   [][]int
	timer int
)

func dfs(u, p int) {
	isLeaf := true
	in[u] = 1e9
	out[u] = -1e9
	for _, v := range adj[u] {
		if v != p {
			isLeaf = false
			dfs(v, u)
			if in[v] < in[u] {
				in[u] = in[v]
			}
			if out[v] > out[u] {
				out[u] = out[v]
			}
		}
	}
	if isLeaf && u != 1 {
		timer++
		in[u] = timer
		out[u] = timer
	}
}

func main() {
	reader := bufio.NewReader(os.Stdin)
	writer := bufio.NewWriter(os.Stdout)
	defer writer.Flush()

	var n int
	if _, err := fmt.Fscan(reader, &n); err != nil {
		return
	}

	c := make([]int64, n+1)
	for i := 1; i <= n; i++ {
		fmt.Fscan(reader, &c[i])
	}

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

	in = make([]int, n+1)
	out = make([]int, n+1)
	dfs(1, 0)

	edges := make([]Edge, 0, n)
	for i := 1; i <= n; i++ {
		if in[i] <= out[i] {
			edges = append(edges, Edge{
				u:  in[i],
				v:  out[i] + 1,
				w:  c[i],
				id: i,
			})
		}
	}

	sort.Slice(edges, func(i, j int) bool {
		return edges[i].w < edges[j].w
	})

	parent := make([]int, timer+2)
	for i := 1; i <= timer+1; i++ {
		parent[i] = i
	}

	var find func(int) int
	find = func(i int) int {
		if parent[i] == i {
			return i
		}
		parent[i] = find(parent[i])
		return parent[i]
	}

	union := func(i, j int) {
		rootI := find(i)
		rootJ := find(j)
		if rootI != rootJ {
			parent[rootI] = rootJ
		}
	}

	current_components := timer + 1
	var total_cost int64
	var valid_edges []int

	for i := 0; i < len(edges); {
		j := i
		for j < len(edges) && edges[j].w == edges[i].w {
			j++
		}

		comps_before := current_components

		for k := i; k < j; k++ {
			if find(edges[k].u) != find(edges[k].v) {
				valid_edges = append(valid_edges, edges[k].id)
			}
		}

		for k := i; k < j; k++ {
			if find(edges[k].u) != find(edges[k].v) {
				union(edges[k].u, edges[k].v)
				current_components--
			}
		}

		total_cost += int64(comps_before-current_components) * edges[i].w
		i = j
	}

	sort.Ints(valid_edges)

	fmt.Fprintln(writer, total_cost, len(valid_edges))
	for i, id := range valid_edges {
		if i > 0 {
			fmt.Fprint(writer, " ")
		}
		fmt.Fprint(writer, id)
	}
	fmt.Fprintln(writer)
}