← Home
package main

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

func main() {
	scanner := bufio.NewScanner(os.Stdin)
	scanner.Split(bufio.ScanWords)

	if !scanner.Scan() {
		return
	}
	n, _ := strconv.Atoi(scanner.Text())

	adj := make([][]int, n+1)
	deg := make([]int, n+1)

	for i := 0; i < n-1; i++ {
		scanner.Scan()
		u, _ := strconv.Atoi(scanner.Text())
		scanner.Scan()
		v, _ := strconv.Atoi(scanner.Text())
		adj[u] = append(adj[u], v)
		adj[v] = append(adj[v], u)
		deg[u]++
		deg[v]++
	}

	leaves := 0
	for i := 2; i <= n; i++ {
		if deg[i] == 1 {
			leaves++
		}
	}

	target := make([]int, leaves)
	pos := make([]int, n+1)
	for i := 0; i <= n; i++ {
		pos[i] = -1
	}

	for i := 0; i < leaves; i++ {
		scanner.Scan()
		target[i], _ = strconv.Atoi(scanner.Text())
		pos[target[i]] = i
	}

	minPos := make([]int, n+1)
	for i := 0; i <= n; i++ {
		minPos[i] = 1e9
	}

	var dfs1 func(int, int)
	dfs1 = func(u, p int) {
		if deg[u] == 1 && u != 1 {
			minPos[u] = pos[u]
		}
		for _, v := range adj[u] {
			if v != p {
				dfs1(v, u)
				if minPos[v] < minPos[u] {
					minPos[u] = minPos[v]
				}
			}
		}
	}
	dfs1(1, 0)

	for i := 1; i <= n; i++ {
		sort.Slice(adj[i], func(a, b int) bool {
			return minPos[adj[i][a]] < minPos[adj[i][b]]
		})
	}

	ans := []int{}
	gotLeaves := []int{}

	var dfs2 func(int, int)
	dfs2 = func(u, p int) {
		ans = append(ans, u)
		if deg[u] == 1 && u != 1 {
			gotLeaves = append(gotLeaves, u)
		}
		for _, v := range adj[u] {
			if v != p {
				dfs2(v, u)
				ans = append(ans, u)
			}
		}
	}
	dfs2(1, 0)

	valid := true
	if len(gotLeaves) != leaves {
		valid = false
	} else {
		for i := 0; i < leaves; i++ {
			if gotLeaves[i] != target[i] {
				valid = false
				break
			}
		}
	}

	if !valid {
		fmt.Println("-1")
	} else {
		for i, x := range ans {
			if i > 0 {
				fmt.Print(" ")
			}
			fmt.Print(x)
		}
		fmt.Println()
	}
}