package main
import (
"bufio"
"fmt"
"os"
"strconv"
)
var (
adj [][]int
res []int
swapped []bool
totalDist int64
scanner *bufio.Scanner
)
func scanInt() int {
scanner.Scan()
val, _ := strconv.Atoi(scanner.Text())
return val
}
func dfs(u, p int) {
for _, v := range adj[u] {
if v == p {
continue
}
dfs(v, u)
if !swapped[v] {
res[u], res[v] = res[v], res[u]
swapped[v] = true
swapped[u] = true
totalDist += 2
}
}
}
func main() {
scanner = bufio.NewScanner(os.Stdin)
scanner.Split(bufio.ScanWords)
writer := bufio.NewWriter(os.Stdout)
defer writer.Flush()
buf := make([]byte, 2048)
scanner.Buffer(buf, 2*1024*1024)
if !scanner.Scan() {
return
}
N, _ := strconv.Atoi(scanner.Text())
adj = make([][]int, N+1)
res = make([]int, N+1)
swapped = make([]bool, N+1)
for i := 1; i <= N; i++ {
res[i] = i
}
for i := 0; i < N-1; i++ {
u := scanInt()
v := scanInt()
adj[u] = append(adj[u], v)
adj[v] = append(adj[v], u)
}
dfs(1, 0)
if !swapped[1] {
v := adj[1][0]
res[1], res[v] = res[v], res[1]
swapped[1] = true
totalDist += 2
}
fmt.Fprintln(writer, totalDist)
for i := 1; i <= N; i++ {
if i > 1 {
fmt.Fprint(writer, " ")
}
fmt.Fprint(writer, res[i])
}
fmt.Fprintln(writer)
}