/*
{
######################
#       Author       #
#        Gary        #
#        2021        #
######################
*/
#include<bits/stdc++.h>
#define rb(a,b,c) for(int a=b;a<=c;++a)
#define rl(a,b,c) for(int a=b;a>=c;--a)
#define LL long long
#define IT iterator
#define PB push_back
#define II(a,b) make_pair(a,b)
#define FIR first
#define SEC second
#define FREO freopen("check.out","w",stdout)
#define rep(a,b) for(int a=0;a<b;++a)
#define SRAND mt19937 rng(chrono::steady_clock::now().time_since_epoch().count())
#define random(a) rng()%a
#define ALL(a) a.begin(),a.end()
#define POB pop_back
#define ff fflush(stdout)
#define fastio ios::sync_with_stdio(false)
#define check_min(a,b) a=min(a,b)
#define check_max(a,b) a=max(a,b)
using namespace std;
//inline int read(){
//    int x=0;
//    char ch=getchar();
//    while(ch<'0'||ch>'9'){
//        ch=getchar();
//    }
//    while(ch>='0'&&ch<='9'){
//        x=(x<<1)+(x<<3)+(ch^48);
//        ch=getchar();
//    }
//    return x;
//}
const int INF=0x3f3f3f3f;
typedef pair<int,int> mp;
/*}
*/
const int MAXN=200000+233;
vector<int> g[MAXN];
int n;
mp fr;
int depth[MAXN],rest[MAXN],cnt;
void dfs(int now,int dis=0,int pre=0){
	check_max(fr,II(dis,now));
	for(auto it:g[now]) if(it!=pre){
		dfs(it,dis+1,now);
	}
}
void dfs2(int now,int pre=0){
	for(auto it:g[now]) if(it!=pre){
		depth[it]=depth[now]+1;
		dfs2(it,now);
	}
	for(auto it:g[now]) if(it!=pre){
		check_max(depth[now],depth[it]); 
	}
}
bool cmp(int A,int B){
	return depth[A]<depth[B];
}
void dfs3(int now,int pre=0){
	rest[now]=++cnt;
	vector<int> ord;
	for(auto it:g[now]) if(it!=pre) ord.PB(it);
	sort(ALL(ord),cmp);
	for(auto it:ord) dfs3(it,now),++cnt;
}
int main(){
	scanf("%d",&n);
	rb(i,1,n-1){
		int u,v;
		scanf("%d%d",&u,&v);
		g[u].PB(v);
		g[v].PB(u);
	}
	fr=II(-1,-1);
	dfs(1);
	int tmp=fr.SEC;
	fr=II(-1,-1);
	dfs(tmp);
	int root=fr.SEC;
	dfs2(root);
	dfs3(root);
	rb(i,1,n) printf("%d ",rest[i]);
	return 0;
}
#include<bits/stdc++.h>
using namespace std;

const int maxn=200005;
int n,ql,qr,lst,s,t;
vector<int>edge[maxn];
int dist[maxn],par[maxn],dep[maxn],que[maxn],ans[maxn];
bool bad[maxn];

void bfs(int s){
	for(int i=1;i<=n;i++)dist[i]=-1;
	dist[s]=0;
	ql=1;qr=0;
	que[++qr]=s;
	while(ql<=qr){
		int x=que[ql++];
		for(int i=0;i<int(edge[x].size());i++){
			int y=edge[x][i];
			if(dist[y]<0)dist[y]=dist[x]+1,par[y]=x,que[++qr]=y;
		}
	}
}

void dfs(int x,int p){
	lst=x;
	int yy=0;
	for(int i=0;i<int(edge[x].size());i++){
		int y=edge[x][i];
		if(y==p)continue;
		if(!bad[y])
			ans[y]=ans[lst]+dist[lst]+dist[y]-2*dist[x],dfs(y,x);
		else yy=y;
	}
	if(yy)
		ans[yy]=ans[lst]+dist[lst]+dist[yy]-2*dist[x],dfs(yy,x);
}

int main(){
	scanf("%d",&n);
	for(int i=1;i<=n-1;i++){
		int u,v;
		scanf("%d%d",&u,&v);
		edge[u].push_back(v);
		edge[v].push_back(u);
	}
	bfs(1);
	for(int i=1;i<=n;i++)if(!s||dist[i]>dist[s])s=i;
	bfs(s);
	for(int i=1;i<=n;i++)if(!t||dist[i]>dist[t])t=i;
	while(t!=s)bad[t]=true,t=par[t];
	ans[s]=1;
	dfs(s,0);
	for(int i=1;i<=n;i++)printf("%d%c",ans[i],i==n?'\n':' ');
	return 0;
}