```go
package main
import (
"bufio"
"fmt"
"os"
"strconv"
)
var (
adj [][]int
p []int
ans int
)
func main() {
scanner := bufio.NewScanner(os.Stdin)
scanner.Split(bufio.ScanWords)
writer := bufio.NewWriter(os.Stdout)
defer writer.Flush()
scanner.Scan()
nStr := scanner.Text()
n, _ := strconv.Atoi(nStr)
adj = make([][]int, n+1)
p = make([]int, n+1)
for i := 1; i <= n; i++ {
p[i] = i
}
for i := 0; i < n-1; i++ {
scanner.Scan()
uStr := scanner.Text()
scanner.Scan()
vStr := scanner.Text()
u, _ := strconv.Atoi(uStr)
v, _ := strconv.Atoi(vStr)
adj[u] = append(adj[u], v)
adj[v] = append(adj[v], u)
}
dfs(1, 0)
if p[1] == 1 {
target := adj[1][0]
p[1], p[target] = p[target], p[1]
ans += 2
}
fmt.Fprintln(writer, ans)
for i := 1; i <= n; i++ {
if i > 1 {
fmt.Fprint(writer, " ")
}
fmt.Fprint(writer, p[i])
}
fmt.Fprintln(writer)
}
func dfs(u, parent int) {
for _, v := range adj[u] {
if v == parent {
continue
}
dfs(v, u)
if p[v] == v {
p[u], p[v] = p[v], p[u]
ans += 2
}
}
}
```