package main
import (
"bufio"
"fmt"
"os"
)
func isPrime(x int) bool {
if x < 2 {
return false
}
if x == 2 {
return true
}
if x%2 == 0 {
return false
}
for i := 3; i*i <= x; i += 2 {
if x%i == 0 {
return false
}
}
return true
}
func main() {
in := bufio.NewReader(os.Stdin)
out := bufio.NewWriter(os.Stdout)
defer out.Flush()
var n int
fmt.Fscan(in, &n)
adj := make([][]int, n)
for i := 0; i < n-1; i++ {
var u, v int
fmt.Fscan(in, &u, &v)
u--
v--
adj[u] = append(adj[u], v)
adj[v] = append(adj[v], u)
}
color := make([]int, n)
for i := range color {
color[i] = -1
}
q := make([]int, 0)
color[0] = 0
q = append(q, 0)
valid := true
for len(q) > 0 && valid {
u := q[0]
q = q[1:]
for _, v := range adj[u] {
if color[v] == -1 {
color[v] = color[u] ^ 1
q = append(q, v)
} else if color[v] == color[u] {
valid = false
break
}
}
}
if !valid {
fmt.Fprintln(out, -1)
return
}
leaf := make([]bool, n)
for i := 0; i < n; i++ {
if len(adj[i]) == 1 {
leaf[i] = true
}
}
candidates := make([][]int, 2)
for i := 0; i < n; i++ {
if leaf[i] {
candidates[color[i]] = append(candidates[color[i]], i+1)
}
}
idx := 0
if len(candidates[1]) < len(candidates[0]) {
idx = 1
}
ans := make([]int, len(candidates[idx]))
copy(ans, candidates[idx])
used := make([]bool, n+1)
for _, v := range ans {
used[v] = true
}
ok := true
for u := 0; u < n && ok; u++ {
if used[u+1] {
continue
}
diff := 0
found := false
for _, v := range adj[u] {
if used[v+1] {
diff = (u + 1) - (v + 1)
if diff < 0 {
diff = -diff
}
if !isPrime(diff) {
ok = false
break
}
found = true
}
}
if !found {
ok = false
}
}
if !ok {
fmt.Fprintln(out, -1)
return
}
fmt.Fprintln(out, len(ans))
for i, v := range ans {
if i > 0 {
fmt.Fprint(out, " ")
}
fmt.Fprint(out, v)
}
fmt.Fprintln(out)
}