← Home
 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)
}