Takahashi has an ability to generate a tree using a permutation (p_1,p_2,...,p_n) of (1,2,...,n), in the following process:

First, prepare Vertex 1, Vertex 2, ..., Vertex N. For each i=1,2,...,n, perform the following operation:

* If p_i = 1, do nothing.
* If p_i \neq 1, let j' be the largest j such that p_j < p_i. Span an edge between Vertex i and Vertex j'.



Takahashi is trying to make his favorite tree with this ability. His favorite tree has n vertices from Vertex 1 through Vertex n, and its i-th edge connects Vertex v_i and w_i. Determine if he can make a tree isomorphic to his favorite tree by using a proper permutation. If he can do so, find the lexicographically smallest such permutation.

Constraints

* 2 \leq n \leq 10^5
* 1 \leq v_i, w_i \leq n
* The given graph is a tree.

Input

Input is given from Standard Input in the following format:


n
v_1 w_1
v_2 w_2
:
v_{n-1} w_{n-1}


Output

If there is no permutation that can generate a tree isomorphic to Takahashi's favorite tree, print `-1`. If it exists, print the lexicographically smallest such permutation, with spaces in between.

Examples

Input

6
1 2
1 3
1 4
1 5
5 6


Output

1 2 4 5 3 6


Input

6
1 2
2 3
3 4
1 5
5 6


Output

1 2 3 4 5 6


Input

15
1 2
1 3
2 4
2 5
3 6
3 7
4 8
4 9
5 10
5 11
6 12
6 13
7 14
7 15


Output

-1
#include <bits/stdc++.h>

using namespace std;

#define pb push_back
#define eb emplace_back
#define ll long long
#define pii pair < int, int >
#define fr first
#define sc second
#define mk make_pair
#define sz(s) (int)s.size()
#define all(s) s.begin(), s.end()
#define ok puts("ok");
#define whatis(x) cerr << #x << " = " << x << endl;
#define pause system("pause");
#define random rand() ^ (rand() << 5)

const int N = (int)1e5 + 7;
const int inf = (int)1e9 + 7;

int n, u, v;
vector < int > gr[N];
int h[N], p[N], is[N], v1;
int cnt = 1;
vector < int > ans, vec[2];

void dfs(int v, int pr = 0) {
	p[v] = pr;
	for (int to : gr[v]) {
		if (to == pr) continue;
		h[to] = h[v] + 1;
		dfs(to, v);
		is[v] = is[to];
	}
}

void no() {
	puts("-1");
	exit(0);
}

void dfs1(int v, int pr = 0) {
	if (is[v]) {
		h[v] = 0;
		int c = 1;
		for (int to : gr[v]) {
			if (to == pr || is[to]) continue;
			ans.pb(cnt + c);
			c++;
		}
		ans.pb(cnt);
		cnt += c;
	} else if (h[v] > 1) {
		no();
	}
	for (int to : gr[v]) {
		if (to == pr) continue;
		h[to] = h[v] + 1;		
		dfs1(to, v);
		
	}
}

int main() {
	scanf("%d", &n);
	for (int i = 1; i < n; i++) {
		scanf("%d %d", &u, &v);
		gr[u].pb(v);
		gr[v].pb(u);
	}
	dfs(1);
	int mx = 0;
	int v = -1;
	int v2;
	for (int i = 1; i <= n; i++) {
		if (h[i] > mx) {
			mx = h[i];
			v = i;
		}
	}
	h[v] = 0;
	dfs(v);
	v2 = v;
	v = -1;
	mx = 0;
	for (int i = 1; i <= n; i++) {
		if (h[i] > mx) {
			mx = h[i];
			v = i;
		}
	}
	int v1 = v;
	while (v != 0) {
		is[v] = 1;
		v = p[v];
	}
	dfs1(v1);
	vec[0] = ans;
	cnt = 1;
	ans.clear();
	dfs1(v2);
	vec[1] = ans;
	int fl = 0;
	for (int i = 1; i <= n; i++) {
		if (vec[0][i - 1] == vec[1][i - 1]) continue;		
		if (vec[0][i - 1] > vec[1][i - 1]) {
			fl = 1;
		}
		break;
	}
	for (int to : vec[fl]) {
		printf("%d ", to);
	}
}