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
//By Don4ick 
//#define _GLIBCXX_DEBUG

#include <bits/stdc++.h>

typedef long long ll;
typedef long double ld;
typedef unsigned int ui;

#define forn(i, n) for (int i = 1; i <= n; i++)
#define pb push_back
#define all(x) x.begin(), x.end()
#define y1 qewr1234

const double PI = acos(-1.0);
const int DIR = 4;
const int X[] = {1, 0, -1, 0};
const int Y[] = {0, 1, 0, -1};

const int N = (int)1e5 + 228;

using namespace std;

int n, res = -1, s, t;
vector < int > g[N], path;

void dfs(int v, int pr, int depth)
{
	if (depth > res)
		s =	v, res = depth;
	for (auto to : g[v])
		if (to != pr)
			dfs(to, v, depth + 1);
}

bool getPath(int v, int pr)
{
	path.pb(v);
	if (v == t)
		return true;
	for (auto to : g[v])	
	{
		if (to == pr)
			continue;
		if (getPath(to, v))
			return true;	
	}
	path.pop_back();
	return false;
}

vector < int > getRes(vector < int > t)
{
	vector < int > res;	
	int cur = 1;
	for (int i = 0; i < (int)t.size(); i++)
	{
		forn(j, t[i])
		{
			res.pb(cur + j);
		}
		res.pb(cur);
		cur += t[i] + 1;
	}
	return res;
} 

int main()
{
	//ios_base::sync_with_stdio(false);
	//cin.tie();
	//cout.tie();		

	//freopen(".in", "r", stdin);
	//freopen(".out", "w", stdout);

	//~read
	scanf("%d", &n); 
	forn(i, n - 1)
	{	
		int v, u;
		scanf("%d%d", &v, &u);
		g[v].pb(u);
		g[u].pb(v);
	}
	//~solve
	dfs(1, -1, 0);
	t = s;
	res = -1;
	s = -1;
	dfs(t, -1, 0);
	getPath(s, -1);
	vector < int > ans, res;
	for (int i = 0; i < (int)path.size(); i++)
	{
		int cnt = 0;
		int v = path[i];
		for (auto to : g[v])
		{	
			if (i > 0 && to == path[i - 1])
				continue;
			if (i < (int)path.size() - 1 && to == path[i + 1])
				continue;
			if ((int)g[to].size() != 1)
			{
				cout << -1;
				return 0;
			}
			cnt++;
		}	
		res.pb(cnt);
	}
	ans = getRes(res);
	reverse(all(res));
	ans = min(ans, getRes(res));
	for (int i = 0; i < n; i++)
		printf("%d ", ans[i]);

	return 0;
}

