```go
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
reader := bufio.NewReader(os.Stdin)
writer := bufio.NewWriter(os.Stdout)
defer writer.Flush()
var n int
fmt.Fscan(reader, &n)
adj := make([][]int, n+1)
for i := 0; i < n-1; i++ {
var a, b int
fmt.Fscan(reader, &a, &b)
adj[a] = append(adj[a], b)
adj[b] = append(adj[b], a)
}
match := make([]int, n+1)
removed := make([]bool, n+1)
deg := make([]int, n+1)
for i := 1; i <= n; i++ {
deg[i] = len(adj[i])
}
queue := make([]int, 0)
for i := 1; i <= n; i++ {
if deg[i] == 1 {
queue = append(queue, i)
}
}
type edge struct{ u, v int }
matchedEdges := make([]edge, 0)
for len(queue) > 0 {
v := queue[0]
queue = queue[1:]
if removed[v] || deg[v] == 0 {
continue
}
var u int = -1
for _, w := range adj[v] {
if !removed[w] {
u = w
break
}
}
if u == -1 {
continue
}
match[v] = u
match[u] = v
matchedEdges = append(matchedEdges, edge{v, u})
removed[v] = true
removed[u] = true
for _, w := range adj[v] {
if !removed[w] {
deg[w]--
if deg[w] == 1 {
queue = append(queue, w)
}
}
}
for _, w := range adj[u] {
if !removed[w] {
deg[w]--
if deg[w] == 1 {
queue = append(queue, w)
}
}
}
}
m := len(matchedEdges)
fmt.Fprintln(writer, 2*(n-m))
ans := make([]int, n+1)
edgeIdx := make([]int, n+1)
for i := range edgeIdx {
edgeIdx[i] = -1
}
for i, e := range matchedEdges {
edgeIdx[e.u] = i
edgeIdx[e.v] = i
}
type lists struct{ uList, vList []int }
edgeLists := make([]lists, len(matchedEdges))
for x := 1; x <= n; x++ {
if match[x] == 0 {
for _, y := range adj[x] {
if match[y] != 0 {
idx := edgeIdx[y]
e := matchedEdges[idx]
if y == e.u {
edgeLists[idx].uList = append(edgeLists[idx].uList, x)
} else {
edgeLists[idx].vList = append(edgeLists[idx].vList, x)
}
break
}
}
}
}
for i, e := range matchedEdges {
u, v := e.u, e.v
ul, vl := edgeLists[i].uList, edgeLists[i].vList
if len(ul) == 0 && len(vl) == 0 {
ans[u] = v
ans[v] = u
} else {
prev := u
for _, x := range ul {
ans[prev] = x
prev = x
}
ans[prev] = v
prev = v
for _, x := range vl {
ans[prev] = x
prev = x
}
ans[prev] = u
}
}
for i := 1; i <= n; i++ {
if i > 1 {
fmt.Fprint(writer, " ")
}
fmt.Fprint(writer, ans[i])
}
fmt.Fprintln(writer)
}
```