// Author -- Frame

#include<bits/stdc++.h>

#define lowbit(x) ((x)&(-(x)))
#define Finline __inline__ __attribute__ ((always_inline))
#define DEBUG fprintf(stderr,"Running on Line %d in Function %s\n",__LINE__,__FUNCTION__)
#define SZ(x) ((int)x.size())
#define mkpr std::make_pair
#define pb push_back

typedef long long ll;
typedef unsigned int uint;
typedef unsigned long long ull;
typedef std::pair<int,int> pi;
typedef std::pair<ll,ll> pl;
using std::min;
using std::max;

const int inf=0x3f3f3f3f,Inf=0x7fffffff;
const ll INF=0x3f3f3f3f3f3f3f3f;

Finline uint rnd(){static uint seed=416;return seed^=seed>>5,seed^=seed<<17,seed^=seed>>13;}
template <typename _Tp>_Tp gcd(const _Tp &a,const _Tp &b){return (!b)?a:gcd(b,a%b);}
template <typename _Tp>Finline _Tp abs(const _Tp &a){return a>=0?a:-a;}
template <typename _Tp>Finline void chmax(_Tp &a,const _Tp &b){(a<b)&&(a=b);}
template <typename _Tp>Finline void chmin(_Tp &a,const _Tp &b){(b<a)&&(a=b);}
template <typename _Tp>Finline void read(_Tp &x)
{
	char ch(getchar());bool f(false);while(!isdigit(ch)) f|=ch==45,ch=getchar();
	x=ch&15,ch=getchar();while(isdigit(ch)) x=(((x<<2)+x)<<1)+(ch&15),ch=getchar();
	f&&(x=-x);
}
template <typename _Tp,typename... Args>Finline void read(_Tp &t,Args &...args){read(t);read(args...);}
template <typename _Tp,typename... Args>Finline _Tp min(const _Tp &a,const _Tp &b,const Args &...args){return a<b?min(a,args...):min(b,args...);}
template <typename _Tp,typename... Args>Finline _Tp max(const _Tp &a,const _Tp &b,const Args &...args){return a<b?max(b,args...):max(a,args...);}
Finline int read_str(char *s)
{
	char ch(getchar());while(ch==' '||ch=='\r'||ch=='\n') ch=getchar();
	char *tar=s;*tar=ch,ch=getchar();while(ch!=' '&&ch!='\r'&&ch!='\n'&&ch!=EOF) *(++tar)=ch,ch=getchar();
	return tar-s+1;
}

const int N=100005;
struct edge{
	int v,nxt;
}c[N<<1];
int front[N],edge_cnt;
Finline void addedge(int u,int v)
{
	c[++edge_cnt]=(edge){v,front[u]};
	front[u]=edge_cnt;
}
int maxx,rt;
void dfs1(int x,int fa,int len)
{
	++len;
	if(len>maxx) maxx=len,rt=x;
	for(int i=front[x];i;i=c[i].nxt)
	{
		int v=c[i].v;
		if(v!=fa) dfs1(v,x,len);
	}
}
int Fa[N];
void _dfs(int x,int fa)
{
	Fa[x]=fa;
	for(int i=front[x];i;i=c[i].nxt) if(c[i].v!=fa) _dfs(c[i].v,x);
}
int len[N];
std::vector<int> v;
bool mark[N];
void dfs2(int x,int fa)
{
	int cnt=0,qwq=0;
	int tag=0;
	for(int i=front[x];i;i=c[i].nxt)
	{
		int v=c[i].v;
		if(v!=fa)
		{
			tag+=mark[v];
			++qwq;
			cnt+=len[v]>0;
			chmax(len[x],len[v]+1);
			dfs2(v,x);
		}
	}
	if(cnt>1)
	{
		printf("-1\n");
		exit(0);
	}
	if(mark[x]) v.pb(qwq-tag);
}
int main()
{
	int n;read(n);int x,y;
	for(int i=1;i<n;++i) read(x,y),addedge(x,y),addedge(y,x);
	dfs1(1,0,0);
	int nd=rt;
	rt=0,maxx=0;
	dfs1(nd,0,0);
	_dfs(nd,0);
	int cur=rt;
	while(cur)
	{
		mark[cur]=true;
		cur=Fa[cur];
	}
	dfs2(nd,0);
	std::vector<int> ans1,rest;
	for(int i=n;i>=1;--i) rest.pb(i);
	for(auto it:v)
	{
		int tmp=rest.back();
		rest.pop_back();
		for(int i=1;i<=it;++i) ans1.pb(rest.back()),rest.pop_back();
		ans1.pb(tmp);
	}
	v.clear();
	dfs2(rt,0);
	std::vector<int> ans2;
	for(int i=n;i>=1;--i) rest.pb(i);
	for(auto it:v)
	{
		int tmp=rest.back();
		rest.pop_back();
		for(int i=1;i<=it;++i) ans2.pb(rest.back()),rest.pop_back();
		ans2.pb(tmp);
	}
	for(int i=0;i<n;++i)
	{
		if(ans1[i]!=ans2[i])
		{
			if(ans1[i]>ans2[i]) ans1=ans2;
			break;
		}
	}
	for(auto it:ans1) printf("%d ",it);
	printf("\n");
	return 0;
}


Measured memory_bytes: 17044