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>
#define clr(x) memset(x,0,sizeof x)
#define For(i,a,b) for (int i=(a);i<=(b);i++)
#define Fod(i,b,a) for (int i=(b);i>=(a);i--)
#define pb(x) push_back(x)
#define mp(x,y) make_pair(x,y)
#define fi first
#define se second
#define outval(x) cerr<<#x" = "<<x<<endl
#define outtag(x) cerr<<"-----------------"#x"-----------------\n"
#define outarr(a,L,R) cerr<<#a"["<<L<<".."<<R<<"] = ";\
                    For(_x,L,R) cerr<<a[_x]<<" ";cerr<<endl;
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair <int,int> pii;
LL read(){
    LL x=0,f=0;
    char ch=getchar();
    while (!isdigit(ch))
        f=ch=='-',ch=getchar();
    while (isdigit(ch))
        x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
    return f?-x:x;
}
const int N=100005;
int n,cnt;
vector <int> e[N];
int dis[N],fa[N];
int findfar(int x,int pre=0,int d=0){
	dis[x]=d,fa[x]=pre;
	int res=x;
	for (auto y : e[x])
		if (y!=pre){
			int z=findfar(y,x,d+1);
			if (dis[z]>dis[res])
				res=z;
		}
	return res;
}
vector <int> d,ans;
bool checkreverse(){
	vector <int> e=d;
	reverse(e.begin(),e.end());
	For(i,0,(int)d.size()-1)
		if (e[i]!=d[i])
			return e[i]<d[i];
	return 0;
}
int main(){
	n=read();
	For(i,1,n-1){
		int x=read(),y=read();
		e[x].pb(y),e[y].pb(x);
	}
	int x=findfar(1),y=findfar(x);
	for (int z=fa[y];z!=x;z=fa[z])
		d.pb(e[z].size()-2);
	if (checkreverse())
		reverse(d.begin(),d.end());
	ans.pb(cnt=1);
	for (auto i : d){
		For(j,cnt+2,cnt+i+1)
			ans.pb(j);
		ans.pb(cnt+1);
		cnt+=i+1;
	}
	ans.pb(n);
	if (ans.size()<n)
		puts("-1");
	else {
		for (auto i : ans)
			printf("%d ",i);
		puts("");
	}
	return 0;
}