← Home
package main

import (
	"bufio"
	"io"
	"os"
	"sort"
)

func readInt(data []byte, idx *int) int {
	n := len(data)
	for *idx < n && (data[*idx] < '0' || data[*idx] > '9') {
		*idx++
	}
	x := 0
	for *idx < n && data[*idx] >= '0' && data[*idx] <= '9' {
		x = x*10 + int(data[*idx]-'0')
		*idx++
	}
	return x
}

func writeInt(w *bufio.Writer, x int) {
	if x == 0 {
		w.WriteByte('0')
		return
	}
	var buf [20]byte
	i := len(buf)
	for x > 0 {
		i--
		buf[i] = byte('0' + x%10)
		x /= 10
	}
	w.Write(buf[i:])
}

func writeInt64(w *bufio.Writer, x int64) {
	if x == 0 {
		w.WriteByte('0')
		return
	}
	var buf [24]byte
	i := len(buf)
	for x > 0 {
		i--
		buf[i] = byte('0' + x%10)
		x /= 10
	}
	w.Write(buf[i:])
}

func main() {
	data, _ := io.ReadAll(os.Stdin)
	idx := 0
	n := readInt(data, &idx)

	parent := make([]int, n)
	children := make([][]int, n)
	for v := 1; v < n; v++ {
		p := readInt(data, &idx)
		parent[v] = p
		children[p] = append(children[p], v)
	}

	sz := make([]int, n)
	for i := 0; i < n; i++ {
		sz[i] = 1
	}
	for v := n - 1; v >= 1; v-- {
		sz[parent[v]] += sz[v]
	}

	for u := 0; u < n; u++ {
		if len(children[u]) > 1 {
			ch := children[u]
			sort.Slice(ch, func(i, j int) bool {
				if sz[ch[i]] != sz[ch[j]] {
					return sz[ch[i]] < sz[ch[j]]
				}
				return ch[i] < ch[j]
			})
		}
	}

	order := make([]int, 0, n)
	pos := make([]int, n)
	stack := make([]int, 0, n)
	stack = append(stack, 0)
	for len(stack) > 0 {
		u := stack[len(stack)-1]
		stack = stack[:len(stack)-1]
		order = append(order, u)
		pos[u] = len(order)
		ch := children[u]
		for i := len(ch) - 1; i >= 0; i-- {
			stack = append(stack, ch[i])
		}
	}

	var k int64
	for v := 1; v < n; v++ {
		k += int64(pos[v] - pos[parent[v]] - 1)
	}

	w := bufio.NewWriterSize(os.Stdout, 1<<20)
	for i, v := range order {
		if i > 0 {
			w.WriteByte(' ')
		}
		writeInt(w, v)
	}
	w.WriteByte('\n')

	writeInt64(w, k)
	w.WriteByte('\n')

	first := true
	for i := len(order) - 1; i >= 1; i-- {
		v := order[i]
		c := pos[v] - pos[parent[v]] - 1
		for j := 0; j < c; j++ {
			if !first {
				w.WriteByte(' ')
			}
			first = false
			writeInt(w, v)
		}
	}
	w.WriteByte('\n')
	w.Flush()
}