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;


void solve() {
    int n; cin >> n;
    vector<vector<int>> g(n);
    vector<int> deg(n, 0);
    for (int _ = 1; _ < n; _++) {
        int x,y;
        cin >> x >> y;
        x--;y--;
        g[x].emplace_back(y);
        g[y].emplace_back(x);
        deg[x]++;
        deg[y]++;
    }
    if (n <= 3) {
        for (int i = 1; i <= n; i++) {
            cout << i << ' '; return;
        }
    }
    vector<int> d(n);
    function<void(int,int)> dfs = [&](int u,int p){
        for (int v: g[u]){
            if (v == p) continue;
            d[v] = d[u] + 1;
            dfs(v,u);
        }
    };
    d[0]=1; dfs(0,-1);
    int root = max_element(d.begin(),d.end())-d.begin();
    vector<int> pa(n,-1);
    function<void(int,int)> find = [&](int u, int p){
        for (int v:g[u]){
            if (v==p) continue;
            d[v] = d[u]+1;
            pa[v] = u;
            find(v, u);
        }
    };
    d[root]=1; find(root, -1);
    int tail = max_element(d.begin(),d.end())-d.begin();
    vector<bool> is_body(n,false);
    vector<int> des;
    {
        int v = tail;
        while (v != -1) {
            des.emplace_back(deg[v]);
            is_body[v] = true;
            v = pa[v];
        }
    }
    for (int i = 0; i < n; i++) {
        if (!is_body[i] && deg[i] > 1) {
            cout << -1; return;
        }
    }
    {
        int m = des.size();
        for (int i = 1; i < m-1; i++) {
            des[i]--;
        }
        auto rdes = des;
        reverse(rdes.begin(), rdes.end());
        if (rdes < des) swap(rdes, des);
    }
    vector<int> res(n);
    int pos = 0, i = 1;
    for (int x: des) {
        for (int j = 1; j < x; j++) {
            res[pos++] = i+j;
        }
        res[pos++] = i;
        i = i+x;
    }
    for (int x: res) {
        cout << x << ' ';
    }
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    solve();
    cout << endl;
}
