//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;
}

