#include<bits/stdc++.h>
#define int long long
using namespace std;

const int maxn=400005;
const int logn=21;
const int inf=1ll<<60;

struct Edge {
	int to,next;
	Edge(int to=0,int next=0):to(to),next(next) {}
};

Edge a[maxn*2];
int cnt;
int top;
int Max;
int root;
int s[maxn];
int h[maxn];
int t[maxn];
int ss[maxn];
int lg[maxn*2];
int ans[maxn];
int pre[maxn];
int depth[maxn];
int st[logn][maxn*2];
bool vis[maxn];

void add(int x,int y) {
	a[++cnt]=Edge(y,h[x]);
	h[x]=cnt;
}

void dfs(int x,int fa) {
	st[0][++top]=x;
	pre[x]=top;
//	t[x]=top;
	depth[x]=depth[fa]+1;
	for(int i=h[x]; i; i=a[i].next) {
		if(a[i].to!=fa) {
			dfs(a[i].to,x);
			st[0][++top]=x;
		}
	}
}

void dfs2(int x,int fa) {
	++top;
	t[x]=top;
	for(int i=h[x]; i; i=a[i].next) {
		if(a[i].to!=fa&&!vis[a[i].to]) {
			dfs2(a[i].to,x);
			++top;
		}
	}
}

int getmin(int x,int y) {
	return depth[x]<depth[y]?x:y;
}

int lca(int x,int y) {
	x=pre[x],y=pre[y];
	if(x>y) {
		swap(x,y);
	}
	int k=lg[y-x+1];
	return getmin(st[k][x],st[k][y-(1<<k)+1]);
}

int dist(int x,int y) {
	return depth[x]+depth[y]-2*depth[lca(x,y)];
}
int prt[maxn];

void dfsmax(int x,int dis) {
	s[++top]=x;
	if(dis>Max) {
		Max=dis;
		root=x;
//		memcpy(ss,s,sizeof(ss));
		ss[0]=top;
	}
	vis[x]=1;
	for(int i=h[x]; i; i=a[i].next) {
		if(!vis[a[i].to]) {
			prt[a[i].to]=x;
			dfsmax(a[i].to,dis+1);
		}
	}
	vis[x]=0;
	--top;
}

void prepare() {
	top=0;
	Max=0;
}

void getdis(int x) {
	prepare();
	dfsmax(x,0);
	prepare();
	int tp=root;
	dfsmax(root,0);
	for(int i=root;i!=tp;i=prt[i]) {
		ans[++ans[0]]=i;
	}
	ans[++ans[0]]=tp;
}

signed main() {
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	int n;
	cin>>n;
	for(int i=1; i<=n-1; i++) {
		int x,y;
		cin>>x>>y;
		add(x,y);
		add(y,x);
	}
	dfs(1,0);
//	for(int i=2; i<=top; i++) {
//		lg[i]=lg[i>>1]+1;
//	}
//	for(int i=1; (1<<i)<=top; i++) {
//		for(int j=1; j+(1<<i)-1<=top; j++) {
//			st[i][j]=getmin(st[i-1][j],st[i-1][j+(1<<(i-1))]);
//		}
//	}
	getdis(1);
	top=0;
//	dfs2(root,0);
//	int k=Max;
//	memcpy(ans,ss,sizeof(ans));
	for(int i=1;i<=ans[0];i++) {
		vis[ans[i]]=1;
	}
	t[ans[1]]=1;
	top=1;
	for(int i=2;i<=ans[0]-1;i++) {
		t[ans[i]]=++top;
		for(int j=h[ans[i]];j;j=a[j].next) {
			if(!vis[a[j].to]) {
				dfs2(a[j].to,0);
				++top;
//				p=max(p,Max);
			}
		}
	}
	t[ans[ans[0]]]=++top;
//	int p=-1;
//	for(int i=1;i<=ans[0];i++) {
//		for(int j=h[ans[i]];j;j=a[j].next) {
//			if(!vis[a[j].to]) {
//				getdis(a[j].to);
//				p=max(p,Max);
//			}
//		}
//	}
//	int sum=1+k+2*(p+1);
//	t[ans[1]]=1;
//	t[ans[ans[0]]]=sum;
//	for(int i=1;i<=ans[0];i++) {
//
//		for(int j=h[ans[i]];j;j=a[j].next) {
//			if(!vis[a[j].to]) {
//				getdis(a[j].to);
//				p=max(p,Max);
//			}
//		}
//	}
////	for(int i=1;i<=n;i++) {
////		if(i!=ans[1]&&i!=ans[ans[0]]) {
////			t[i]=dist(ans[1],i)+1;
////		}
////	}
	for(int i=1; i<=n; i++) {
		cout<<t[i]<<" ";
	}
}
#include<algorithm>
#include<cstdio>
#define MaxN 400500
using namespace std;
int f[MaxN],o[MaxN],c[MaxN];
int find(int u)
{return f[u]==u ? u : f[u]=find(f[u]);}
void merge(int u,int v){
  u=find(u);v=find(v);
  if (u!=v){
    o[f[u]=v]+=o[u];
    c[v]+=c[u];
  }o[v]++;
}
bool vis[MaxN];
int n;
int main()
{
  scanf("%d",&n);
  for (int i=1;i<=400000;i++)c[f[i]=i]=1;
  for (int i=1,u,v;i<=n;i++){
    scanf("%d%d",&u,&v);
    merge(u,v);
  }
  int ans=0;
  for (int i=1;i<=400000;i++){
    int u=find(i);
    if (vis[u])continue;
    vis[u]=1;
    ans+=o[u]>=c[u] ? c[u] : c[u]-1;
  }printf("%d",ans);
  return 0;
}