#include <bits/stdc++.h>
using namespace std;
const long long N = 1e5 + 4;
set<long long> g[N];
vector<long long> ans_1;
long long star[N];
long long _ptr;
long long sz[N];
long long dfs_prec(long long v, long long pr) {
  sz[v] = 1;
  for (auto i : g[v]) {
    if (i != pr) {
      dfs_prec(i, v);
      sz[v] = max(sz[v], sz[i] + 1);
    }
  }
  return sz[v];
}
struct go {
  long long first;
  long long second;
};
bool operator<(go a, go b) {
  if (a.first == b.first) {
    return a.second < b.second;
  }
  return a.first < b.first;
}
void dfs(long long v, long long pr) {
  star[_ptr++] = v;
  set<go> st;
  for (auto i : g[v]) {
    if (i != pr) {
      st.insert({sz[i], i});
    }
  }
  while (st.size() > 1) {
    auto x = *st.begin();
    auto y = *st.rbegin();
    g[x.second].insert(y.second);
    sz[x.second] = max(sz[x.second], sz[y.second] + 1);
    g[y.second].erase(v);
    g[y.second].insert(x.second);
    st.erase(st.begin());
    st.erase(prev(st.end()));
    st.insert({sz[x.second], x.second});
    ans_1.push_back(y.second);
  }
  if (!st.empty()) {
    dfs(st.begin()->second, v);
  }
}
signed main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  long long n;
  cin >> n;
  for (long long i = 2; i <= n; ++i) {
    long long p;
    cin >> p;
    ++p;
    g[i].insert(p);
    g[p].insert(i);
  }
  dfs_prec(1, 0);
  dfs(1, 0);
  for (long long i = 0; i < _ptr; ++i) {
    cout << star[i] - 1 << ' ';
  }
  reverse((ans_1).begin(), (ans_1).end());
  cout << '\n';
  cout << ans_1.size() << '\n';
  for (auto i : ans_1) {
    cout << i - 1 << ' ';
  }
}
