#include <bits/stdc++.h>
using namespace std;
template <class T>
using min_pq = priority_queue<T, vector<T>, greater<T>>;
const int MAXN = 1e5 + 10, MAXQ = 3e5 + 10, MAXL = 18, ALP = 26, MOD = 1e9 + 7,
          MAXK = 17, MAXA = 10, MAXB = 24, MAXBB = (1 << MAXB);
const string no = "NO\n", yes = "YES\n";
const int hA[4] = {1, 0, -1, 0}, kA[4] = {0, 1, 0, -1};
const int INF = 1e9 + 10;
int n, par[MAXN], md[MAXN], st[MAXN], tt = 0;
vector<int> adj[MAXN];
int dfs1(int c = 0) {
  md[c] = 1;
  for (auto nxt : adj[c]) md[c] = max(md[c], dfs1(nxt) + 1);
  return md[c];
}
void dfs2(int c = 0) {
  sort(adj[c].begin(), adj[c].end(),
       [&](int i, int j) { return md[i] < md[j]; });
  st[tt++] = c;
  for (auto nxt : adj[c]) dfs2(nxt);
}
void solve() {
  cin >> n;
  for (int i = 1; i < n; i++) {
    cin >> par[i], adj[par[i]].push_back(i);
  }
  dfs1(), dfs2();
  vector<int> ans;
  ans.reserve(n);
  for (int i = 1; i < n; i++) {
    for (int a = st[i], b = st[i - 1]; b != par[a]; b = par[b])
      ans.push_back(a);
  }
  for (int i = 0; i < n; i++) cout << st[i] << ' ';
  cout << '\n';
  cout << (int)ans.size() << '\n';
  for (int c : ans) cout << c << ' ';
  cout << '\n';
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  int t_c = 1;
  while (t_c--) solve();
}
