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;

typedef long long ll;
typedef vector<int> vi;
typedef vector<ll> vl;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;

typedef int _loop_int;
#define REP(i,n) for(_loop_int i=0;i<(_loop_int)(n);++i)
#define FOR(i,a,b) for(_loop_int i=(_loop_int)(a);i<(_loop_int)(b);++i)
#define FORR(i,a,b) for(_loop_int i=(_loop_int)(b)-1;i>=(_loop_int)(a);--i)

#define DEBUG(x) cout<<#x<<": "<<x<<endl
#define DEBUG_VEC(v) cout<<#v<<":";REP(i,v.size())cout<<" "<<v[i];cout<<endl
#define ALL(a) (a).begin(),(a).end()

#define CHMIN(a,b) a=min((a),(b))
#define CHMAX(a,b) a=max((a),(b))

// mod
const ll MOD = 1000000007ll;
#define FIX(a) ((a)%MOD+MOD)%MOD

// floating
typedef double Real;
const Real EPS = 1e-11;
#define EQ0(x) (abs(x)<EPS)
#define EQ(a,b) (abs(a-b)<EPS)
typedef complex<Real> P;

int n;
vi g[125252];

int p[125252];
int sz[125252];
bool vstd[125252];

int main(){
  scanf("%d",&n);
  REP(i,n-1){
    int s,t;
    scanf("%d%d",&s,&t);
    --s;--t;
    g[s].push_back(t);
    g[t].push_back(s);
  }
  vi roots;
  REP(i,n){
    int cnt = 0;
    for(int x : g[i]){
      if(g[x].size()>=2)cnt++;
    }
    if(cnt>=3){
      puts("-1");return 0;
    }
    sz[i] = cnt;
  }
  REP(i,n){
    if(g[i].size()==1){
      if(sz[g[i][0]]<=1 && !vstd[g[i][0]]){
        vstd[g[i][0]] = true;
        roots.push_back(i);
      }
    }
  }
  if(roots.size()==0){
    puts("-1");return 0;
  }
  vi ans(n,n+1);
  for(int root : roots){
    vector<bool> used(n,false);
    vi p;
    int v = 1;
    int cur = root;
    used[cur]=true;
    while(true){
      int cnt = 0;
      int nxt = -1;
      for(int x : g[cur])if(!used[x]){
        cnt++;
        if(g[x].size()>=2)nxt=x;
      }
      int res = v++;
      REP(_,cnt-1)p.push_back(v++);
      p.push_back(res);
      if(nxt==-1){
        p.push_back(v++);
        break;
      }
      for(int x : g[cur]){
        used[x] = true;
      }
      cur = nxt;
    }
    CHMIN(ans, p);
  }
  REP(i,n)printf("%d%c",ans[i],i==n?'\n':' ');
  return 0;
}
