#include<bits/stdc++.h>

using namespace std;

#define ll  long long
#define ld  double

#define sz(x)   (int)x.size()
#define all(x)  x.begin(),x.end()

#define pb  emplace_back
#define X   first
#define Y   second

const int   N   = 2e5 + 5;

int R;
int d[N];

vector<int> g[N];
vector<int> path;

void dfs(int u,int p)   {
    d[u] = d[p] + 1;

    if (d[R] < d[u])
        R = u;
    
    for(int v : g[u])   if (v != p)
        dfs(v,u);
}
bool on_diameter[N];

void cal(int u,int p)   {
    path.pb(u);

    if (u == R) {
        on_diameter[u] = 1;
        return;
    }   
    for(int v : g[u])   if (v != p) {
        cal(v,u);
        if (on_diameter[v]) {
            on_diameter[u] = 1;
            return;
        }
    }
    path.pop_back();
}

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

    int n;  cin >> n;

    for(int i = 1 ; i < n ; ++i)    {
        int x;  cin >> x;
        int y;  cin >> y;

        g[x].pb(y);
        g[y].pb(x);
    }
    dfs(1,0);   int Rt = R;
    dfs(Rt,0);
    cal(Rt,0);

    vector<int> ans(n,1e9);

    for(int T = 0 ; T < 2 ; ++T)    {
        vector<int> res;
        int cur = 1;

        for(int x : path)   {
            int cnt = 0;

            for(int v : g[x])   if(!on_diameter[v]) {
                if (g[v].size() > 1)    {
                    cout << -1;
                    return  0;
                }
                cnt++;
            }
            for(int i = 1 ; i <= cnt ; ++i)
                res.pb(cur + i);
            
            res.pb(cur);
            cur += cnt + 1;
        }
        if (ans > res)
            ans = res;
        
        reverse(all(path));
    }
    for(int x : ans)    cout << x << " ";
}
### Prompt

In CPP, your task is to solve the following problem:

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

### Response

```cpp
#include<bits/stdc++.h>

using namespace std;

#define ll  long long
#define ld  double

#define sz(x)   (int)x.size()
#define all(x)  x.begin(),x.end()

#define pb  emplace_back
#define X   first
#define Y   second

const int   N   = 2e5 + 5;

int R;
int d[N];

vector<int> g[N];
vector<int> path;

void dfs(int u,int p)   {
    d[u] = d[p] + 1;

    if (d[R] < d[u])
        R = u;
    
    for(int v : g[u])   if (v != p)
        dfs(v,u);
}
bool on_diameter[N];

void cal(int u,int p)   {
    path.pb(u);

    if (u == R) {
        on_diameter[u] = 1;
        return;
    }   
    for(int v : g[u])   if (v != p) {
        cal(v,u);
        if (on_diameter[v]) {
            on_diameter[u] = 1;
            return;
        }
    }
    path.pop_back();
}

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

    int n;  cin >> n;

    for(int i = 1 ; i < n ; ++i)    {
        int x;  cin >> x;
        int y;  cin >> y;

        g[x].pb(y);
        g[y].pb(x);
    }
    dfs(1,0);   int Rt = R;
    dfs(Rt,0);
    cal(Rt,0);

    vector<int> ans(n,1e9);

    for(int T = 0 ; T < 2 ; ++T)    {
        vector<int> res;
        int cur = 1;

        for(int x : path)   {
            int cnt = 0;

            for(int v : g[x])   if(!on_diameter[v]) {
                if (g[v].size() > 1)    {
                    cout << -1;
                    return  0;
                }
                cnt++;
            }
            for(int i = 1 ; i <= cnt ; ++i)
                res.pb(cur + i);
            
            res.pb(cur);
            cur += cnt + 1;
        }
        if (ans > res)
            ans = res;
        
        reverse(all(path));
    }
    for(int x : ans)    cout << x << " ";
}
```