#include <bits/stdc++.h>
using namespace std;
int inline read() {
  int num = 0, neg = 1;
  char c = getchar();
  while (!isdigit(c)) {
    if (c == '-') neg = -1;
    c = getchar();
  }
  while (isdigit(c)) {
    num = (num << 3) + (num << 1) + c - '0';
    c = getchar();
  }
  return num * neg;
}
const int maxn = 100010;
int n, head[maxn], cnt, size[maxn], total, fa[maxn], p[maxn], dep[maxn],
    f[maxn];
struct Edge {
  int nxt, to;
} edge[maxn];
void add_edge(int x, int y) {
  edge[++cnt].nxt = head[x];
  edge[cnt].to = y;
  head[x] = cnt;
}
void dfs(int x) {
  dep[x] = dep[fa[x]] + 1;
  size[x] = 1;
  int flag = 1;
  for (int i = head[x]; i; i = edge[i].nxt) {
    int v = edge[i].to;
    dfs(v);
    flag = 0;
    f[x] = max(f[v], f[x]);
    size[x] += size[v];
  }
  if (flag) f[x] = dep[x];
}
struct Node {
  int val, id;
} A[maxn];
int line[maxn], opt[maxn * 10], top, ID[maxn];
bool cmp(Node x, Node y) { return x.val < y.val; }
void solve(int x, int id) {
  line[id] = x;
  if (size[x] == 1) return;
  int tot = 0;
  for (int i = head[x]; i; i = edge[i].nxt) {
    int v = edge[i].to;
    A[++tot].val = f[v];
    A[tot].id = v;
  }
  int sum = id + 1;
  sort(A + 1, A + tot + 1, cmp);
  for (int i = 1; i <= tot; i++) {
    int v = A[i].id;
    ID[v] = sum;
    sum = ID[v] + size[v];
  }
  Node B[tot + 1];
  for (int i = 1; i <= tot; i++) B[i] = A[i];
  for (int i = 1; i <= tot; i++) {
    int v = B[i].id;
    solve(v, ID[v]);
  }
}
void Getopt(int x) {
  if (x == n + 1) return;
  while (fa[line[x]] != p[line[x]]) {
    p[line[x]] = fa[p[line[x]]];
    opt[++top] = line[x];
  }
  Getopt(x + 1);
}
int main() {
  n = read();
  for (int i = 2; i <= n; i++) {
    int v = read() + 1;
    add_edge(v, i);
    fa[i] = v;
  }
  dfs(1);
  solve(1, 1);
  for (int i = 2; i <= n; i++) p[line[i]] = line[i - 1];
  Getopt(2);
  for (int i = 1; i <= n; i++) printf("%d ", line[i] - 1);
  printf("\n%d\n", top);
  for (int i = 1; i <= top; i++) printf("%d ", opt[i] - 1);
  return 0;
}
