#include <iostream>
#include<bits/stdc++.h>

using namespace std;

typedef long long int ll;

ll id=1;

void dfs(ll node , vector<ll> g[] , vector<ll> &dp , vector<ll> &visited , map<vector<ll>,ll> &mpp
, vector<ll> &parent){
	
	visited[node]=1;
	
    for(auto it : g[node]){
		
	if(!visited[it]){
		parent[it] = node;
		dfs(it , g , dp , visited,mpp,parent);
	}
}
	
	vector<ll> a;
	
	for(auto it : g[node]){
	if(it!=parent[node]){
		a.push_back(dp[it]);
	}
	}
	
	sort(a.begin(),a.end());
	
	if(mpp.find(a)==mpp.end()){
		mpp[a]=id;
		id++;
	}
	dp[node] = mpp[a];
	
	cout<<node<<" "<<dp[node]<<endl;
	
	
}

int main() {
	
	ll n;
	cin>>n;
	
	vector<ll> g[n+1];

	for(ll i=1;i<n;i++){
		ll u;
		ll v;
		cin>>u>>v;
		g[u].push_back(v);
		g[v].push_back(u);
	}
	
	vector<ll> dp(n+1,0);
	vector<ll> visited(n+1,0);
	vector<ll> parent(n+1,-1);
	
	map<vector<ll>,ll> mpp;
	
	ll node = 1;
	
	dfs(node, g , dp , visited , mpp ,parent);
	
	cout<<"total number of different subtrees "<<dp[node]<<endl;
	

	return 0;
}