package main
import (
"bufio"
"fmt"
"os"
"strconv"
)
func main() {
scanner := bufio.NewScanner(os.Stdin)
scanner.Split(bufio.ScanWords)
buffer := make([]byte, 0, 64*1024)
scanner.Buffer(buffer, 1024*1024)
if !scanner.Scan() {
return
}
n, _ := strconv.Atoi(scanner.Text())
type Edge struct {
to int
t int
}
adj := make([][]Edge, n+1)
for i := 0; i < n-1; i++ {
scanner.Scan()
u, _ := strconv.Atoi(scanner.Text())
scanner.Scan()
v, _ := strconv.Atoi(scanner.Text())
scanner.Scan()
t, _ := strconv.Atoi(scanner.Text())
adj[u] = append(adj[u], Edge{v, t})
adj[v] = append(adj[v], Edge{u, t})
}
var ans []int
var dfs func(u, p, t int) int
dfs = func(u, p, t int) int {
selected := 0
for _, e := range adj[u] {
if e.to != p {
selected += dfs(e.to, u, e.t)
}
}
if selected == 0 && t == 2 {
ans = append(ans, u)
selected++
}
return selected
}
dfs(1, 0, 1)
fmt.Println(len(ans))
if len(ans) > 0 {
for i, v := range ans {
if i > 0 {
fmt.Print(" ")
}
fmt.Print(v)
}
fmt.Println()
}
}