Once upon a time there was only one router in the well-known company Bmail. Years went by and over time new routers were purchased. Every time they bought a new router, they connected it to one of the routers bought before it. You are given the values p_i — the index of the router to which the i-th router was connected after being purchased (p_i < i).

There are n routers in Boogle in total now. Print the sequence of routers on the path from the first to the n-th router.

Input

The first line contains integer number n (2 ≤ n ≤ 200000) — the number of the routers. The following line contains n-1 integers p_2, p_3, ..., p_n (1 ≤ p_i < i), where p_i is equal to index of the router to which the i-th was connected after purchase.

Output

Print the path from the 1-st to the n-th router. It starts with 1 and ends with n. All the elements in the path should be distinct.

Examples

Input

8
1 1 2 2 3 2 5


Output

1 2 5 8 

Input

6
1 2 3 4 5


Output

1 2 3 4 5 6 

Input

7
1 1 2 3 4 3


Output

1 3 7 
#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);
}
