You are given a tree (a graph with n vertices and n - 1 edges in which it's possible to reach any vertex from any other vertex using only its edges).

A vertex can be destroyed if this vertex has even degree. If you destroy a vertex, all edges connected to it are also deleted.

Destroy all vertices in the given tree or determine that it is impossible.

Input

The first line contains integer n (1 ≤ n ≤ 2·105) — number of vertices in a tree.

The second line contains n integers p1, p2, ..., pn (0 ≤ pi ≤ n). If pi ≠ 0 there is an edge between vertices i and pi. It is guaranteed that the given graph is a tree.

Output

If it's possible to destroy all vertices, print "YES" (without quotes), otherwise print "NO" (without quotes).

If it's possible to destroy all vertices, in the next n lines print the indices of the vertices in order you destroy them. If there are multiple correct answers, print any.

Examples

Input

5
0 1 2 1 2


Output

YES
1
2
3
5
4


Input

4
0 1 2 3


Output

NO

Note

In the first example at first you have to remove the vertex with index 1 (after that, the edges (1, 2) and (1, 4) are removed), then the vertex with index 2 (and edges (2, 3) and (2, 5) are removed). After that there are no edges in the tree, so you can remove remaining vertices in any order.

<image>

Source: codeforces | Difficulty: HARD
Tags: Graph traversal

Constructive algorithms

Greedy algorithms

Tree algorithms

Dynamic programming


Solutions:
from collections import defaultdict, deque
import sys
import bisect
import math
input = sys.stdin.readline
mod = 1000000007

def bfs(root, count):
	q = deque([root])
	vis.add(root)
	while q:
		vertex = q.popleft()
		for child in graph[vertex]:
			if ans[child] == 0:
				ans[child] = count + 1
				count += 1
			if child not in vis:
				q.append(child)
				vis.add(child)
graph = defaultdict(list)
n = int(input())
p = [int(i) for i in input().split() if i != '\n']
if n & 1:
	for i in range(n):
		if p[i] != 0:
			graph[p[i]].append(i + 1)
			graph[i + 1].append(p[i])
	length = [0] * (n + 1)
	for i in graph:
		length[i] = len(graph[i])
	(CHECK, OBSERVE) = (1, 0)
	stack = [(OBSERVE, 1, 0)]
	ans = [0] * (n + 1)
	count = 0
	while stack:
		(state, vertex, parent) = stack.pop()
		if state == OBSERVE:
			stack.append((CHECK, vertex, parent))
			for child in graph[vertex]:
				if child != parent:
					stack.append((OBSERVE, child, vertex))
		elif length[vertex] % 2 == 0:
			count += 1
			ans[vertex] = count
			length[parent] -= 1
	vis = set()
	bfs(1, count)
	out = [0] * n
	for i in range(1, n + 1):
		out[ans[i] - 1] = i
	print('YES')
	for i in out:
		sys.stdout.write(str(i) + '\n')
else:
	print('NO')