← Home
package main

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

type Scanner struct {
	buf []byte
	pos int
}

func NewScanner() *Scanner {
	buf, _ := io.ReadAll(os.Stdin)
	return &Scanner{buf: buf, pos: 0}
}

func (s *Scanner) NextInt() int {
	for s.pos < len(s.buf) && (s.buf[s.pos] < '0' || s.buf[s.pos] > '9') {
		s.pos++
	}
	if s.pos >= len(s.buf) {
		return 0
	}
	res := 0
	for s.pos < len(s.buf) && s.buf[s.pos] >= '0' && s.buf[s.pos] <= '9' {
		res = res*10 + int(s.buf[s.pos]-'0')
		s.pos++
	}
	return res
}

func main() {
	sc := NewScanner()
	writer := bufio.NewWriter(os.Stdout)
	defer writer.Flush()

	n := sc.NextInt()
	k := sc.NextInt()

	if n == 0 {
		return
	}

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

	isMarked := make([]bool, n+1)
	for i := 0; i < 2*k; i++ {
		u := sc.NextInt()
		isMarked[u] = true
	}

	sz := make([]int, n+1)
	var dfsSize func(u, p int)
	dfsSize = func(u, p int) {
		if isMarked[u] {
			sz[u] = 1
		}
		for _, v := range adj[u] {
			if v != p {
				dfsSize(v, u)
				sz[u] += sz[v]
			}
		}
	}
	dfsSize(1, 0)

	var findCentroid func(u, p int) int
	findCentroid = func(u, p int) int {
		for _, v := range adj[u] {
			if v != p && sz[v] > k {
				return findCentroid(v, u)
			}
		}
		return u
	}

	c := findCentroid(1, 0)

	markedNodes := make([]int, 0, 2*k)
	var dfsCollect func(u, p int)
	dfsCollect = func(u, p int) {
		if isMarked[u] {
			markedNodes = append(markedNodes, u)
		}
		for _, v := range adj[u] {
			if v != p {
				dfsCollect(v, u)
			}
		}
	}
	dfsCollect(c, 0)

	writer.WriteString("1\n")
	writer.WriteString(strconv.Itoa(c) + "\n")
	for i := 0; i < k; i++ {
		writer.WriteString(strconv.Itoa(markedNodes[i]) + " " + strconv.Itoa(markedNodes[i+k]) + " " + strconv.Itoa(c) + "\n")
	}
}