#include<queue>
#include<vector>
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
#define pb push_back
#define sz(x) x.size()
#define all(x) x.begin(),x.end()
void Rd(int&res){
res=0;char c;
while(c=getchar(),c<48);
do res=res*10+(c&15);
while(c=getchar(),c>47);
}
const int N=500001;
int n,head[N],tot_edge;
struct Edge{
int to,nxt;
}edge[N<<1];
void add_edge(int a,int b){
edge[tot_edge]=(Edge){b,head[a]};
head[a]=tot_edge++;
}
int tot,dis[N],core[N];
bool used[N];
queue<int>Q;
void SP(){
Q.push(1);used[1]=1;dis[1]=0;
while(!Q.empty()){
int p=Q.front();Q.pop();
for(int i=head[p];~i;i=edge[i].nxt){
int to=edge[i].to;
if(used[to])continue;
Q.push(to);
used[to]=true;
dis[to]=dis[p]+1;
}
}memset(used,0,sizeof(used));
}
void path(int p){
used[p]=true;core[dis[p]+1]=p;
for(int i=head[p];~i;i=edge[i].nxt){
int to=edge[i].to;
if(dis[to]==dis[p]-1){
path(to);break;
}
}
}
#define NO puts("BRAK"),exit(0)
int son[N],md;
bool is_ok[N];
void dfs(int p,int f,int d){
is_ok[p]=false;md=max(md,d);
for(int i=head[p];~i;i=edge[i].nxt){
int to=edge[i].to;
if(to==f)continue;
is_ok[p]=true;
dfs(to,p,d+1);
son[p]+=is_ok[to];
}
if(son[p]>=2)NO;
}
struct Branch{
int id,flag;
bool operator <(const Branch&tmp)const{
return flag<tmp.flag;
}
};
vector<Branch>bra[N];
bool fre[N],state[N];
void manage(int p){
fre[p]=true;int cnt=0;
for(int i=head[p];~i;i=edge[i].nxt){
int to=edge[i].to;
if(used[to])continue;
fre[p]=false;
md=0;dfs(to,p,0);
if(md<1)bra[p].pb((Branch){to,0});
else bra[p].pb((Branch){to,1}),cnt++;
}
if(cnt>2)NO;
else if(cnt==2)state[p]=1;
else state[p]=0;
}
void init(){
memset(head,-1,sizeof(head));
Rd(n);
for(int i=1,a,b;i<n;i++){
Rd(a),Rd(b);
add_edge(a,b);
add_edge(b,a);
}
SP();path(n);tot=dis[n]+1;
for(int i=1;i<=tot;i++)
manage(core[i]);
}
vector<int>num;
void find(int p,int f){
num.pb(p);
for(int i=head[p];~i;i=edge[i].nxt){
int to=edge[i].to;
if(to==f)continue;
if(is_ok[to]&&!used[to])find(to,p);
}
}
int ans[N],allc;
void traverse(int p,int f){
if(!is_ok[p]){ans[++allc]=p;return;}
num.clear();find(p,0);
for(int cas=0;cas<sz(num);cas++){
int cur=num[cas];
if(cas%2==f){
for(int i=head[cur];~i;i=edge[i].nxt){
int to=edge[i].to;
if(!is_ok[to]&&!used[to])ans[++allc]=to;
}
}else ans[++allc]=cur;
}
for(int cas=sz(num)-1;cas>=0;cas--){
int cur=num[cas];
if(cas%2==f)ans[++allc]=cur;
else{
for(int i=head[cur];~i;i=edge[i].nxt){
int to=edge[i].to;
if(!is_ok[to]&&!used[to])ans[++allc]=to;
}
}
}
}
void solve(){
bool ok=true;
for(int i=1;i<=tot;i++){
int p=core[i];
if(ok&&state[p]==1)NO;
if(ok&&!fre[p]){
ans[++allc]=p;
sort(all(bra[p]));
for(int j=sz(bra[p])-1;j>=0;j--)traverse(bra[p][j].id,0);
}else if(ok&&fre[p]){
ans[++allc]=p;
ok=false;
}else if(!ok&&!state[p]){
sort(all(bra[p]));
for(int j=0;j<sz(bra[p]);j++)traverse(bra[p][j].id,1);
ans[++allc]=p;
}else{
sort(all(bra[p]));
for(int j=0;j<sz(bra[p])-1;j++)traverse(bra[p][j].id,1);
ans[++allc]=p;
traverse(bra[p][sz(bra[p])-1].id,0);
ok=true;
}
}
}
void Print(){
if(ans[allc]!=n)NO;
for(int i=1;i<=allc;i++)
printf("%d\n",ans[i]);
}
int main(){
init();
solve();
Print();
return 0;
}