#include <bits/stdc++.h>
using namespace std;
void addEdge(vector<int> adj[], int u, int v) {
  adj[u].push_back(v);
  adj[v].push_back(u);
}
void DFSUtil(int u, vector<int> adj[], vector<bool> &visited) {
  visited[u] = true;
  cout << u + 1 << " ";
  for (int i = 0; i < adj[u].size(); i++)
    if (visited[adj[u][i]] == false) DFSUtil(adj[u][i], adj, visited);
}
void DFS(vector<int> adj[], int V) {
  vector<bool> visited(V, false);
  for (int u = 0; u < V; u++)
    if (visited[u] == false) DFSUtil(u, adj, visited);
}
bool BFS(vector<int> adj[], int src, int dest, int v, int pred[], int dist[]) {
  list<int> queue;
  bool visited[v];
  for (int i = 0; i < v; i++) {
    visited[i] = false;
    dist[i] = INT_MAX;
    pred[i] = -1;
  }
  visited[src] = true;
  dist[src] = 0;
  queue.push_back(src);
  while (!queue.empty()) {
    int u = queue.front();
    queue.pop_front();
    for (int i = 0; i < adj[u].size(); i++) {
      if (visited[adj[u][i]] == false) {
        visited[adj[u][i]] = true;
        dist[adj[u][i]] = dist[u] + 1;
        pred[adj[u][i]] = u;
        queue.push_back(adj[u][i]);
        if (adj[u][i] == dest) return true;
      }
    }
  }
  return false;
}
void printShortestDistance(vector<int> adj[], int s, int dest, int v) {
  int pred[v], dist[v];
  if (BFS(adj, s, dest, v, pred, dist) == false) {
    cout << "Given source and destination"
         << " are not connected";
    return;
  }
  vector<int> path;
  int crawl = dest;
  path.push_back(crawl);
  while (pred[crawl] != -1) {
    path.push_back(pred[crawl]);
    crawl = pred[crawl];
  }
  for (int i = path.size() - 1; i >= 0; i--) cout << path[i] + 1 << " ";
}
int main() {
  int V, k;
  cin >> V;
  vector<int> adj[V];
  for (int i = 1; i <= V - 1; i++) {
    cin >> k;
    addEdge(adj, k - 1, i);
  }
  int source = 0, dest = V - 1;
  printShortestDistance(adj, source, dest, V);
}
