10
6 8
3 10
1 9
6 1
8 2
5 7
3 6
10 4
3 5
 1
 5
1 2
2 3
3 4
4 5
 7
2 3
2 6
1 2
3 7
6 5
3 4
 10
8 4
8 10
8 1
8 2
5 9
5 3
5 7
8 5
5 6
 10
8 6
3 4
10 9
7 10
1 3
4 2
6 1
5 8
9 5
 10
1 10
6 9
5 4
1 3
1 2
3 8
6 7
8 6
1 5
 20
13 4
7 6
9 13
9 2
9 16
4 18
16 5
11 15
16 14
13 12
13 8
16 17
7 1
9 19
17 3
15 20
1 11
2 7
5 10
 3
1 2
1 3
 50
18 47
18 12
42 16
21 44
43 39
20 27
25 1
11 29
9 24
19 42
3 34
16 38
14 48
23 41
8 43
29 2
40 4
45 36
43 9
49 3
41 17
41 15
35 49
43 20
5 32
34 46
8 21
43 45
29 40
39 26
27 33
24 50
38 7
39 19
43 31
24 10
3 14
39 22
43 23
47 13
20 11
25 8
16 30
44 18
19 37
39 5
49 28
25 35
46 6
 15
11 2
5 13
9 4
5 7
11 5
13 14
2 10
3 11
7 1
7 6
10 15
9 12
2 9
10 8
 31
15 2
23 19
11 4
26 6
1 20
14 11
19 13
26 12
12 27
20 14
22 21
4 16
10 18
5 23
4 31
12 8
2 17
19 30
14 26
2 28
22 7
23 9
20 5
5 15
9 29
15 10
6 25
6 24
9 3
11 22
 63
34 40
43 62
33 43
49 6
17 47
26 13
35 15
40 16
17 44
37 34
18 55
57 10
16 14
39 56
36 5
4 33
4 59
54 24
37 45
21 31
57 2
19 8
43 41
49 48
15 19
35 4
15 63
30 50
11 30
59 18
20 46
18 1
33 17
31 22
40 54
63 49
29 25
46 9
16 3
42 23
59 7
54 53
42 38
8 60
8 58
7 51
36 28
63 36
21 57
25 37
45 20
25 35
19 26
20 42
30 32
11 39
7 12
31 52
45 21
26 27
34 11
46 61

9
 1
 1
 1
 1
 2
 10
 18
 2
 13
 1
 3
 1


#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>

using namespace __gnu_pbds;
using namespace std;

#define ff first
#define ss second
#define pb push_back
#define pf push_front
#define mp make_pair
#define popb pop_back
#define popf pop_front
#define all(v) v.begin(), v.end()
#define fori(i, j, k) for (int i = (j); i < (int)(k); i++)
#define forb(i, j, k) for (int i = (j); i >= (int)k; i--)
#define lchild(ind) 2 * ind + 1
#define rchild(ind) 2 * ind + 2
#define bug(val) cout << "# " << val << endl;
#define bugs(val) cout << '_' << val;
#define bugl(val) cout << "## " << val << endl;

template<typename T>
using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;

typedef long long ll;
typedef long double ld;
typedef pair<int, int> pii;
typedef pair<int, ll> pil;
typedef pair<ll, int> pli;
typedef pair<ll, ll> pll;
typedef pair<int, pll> pip;
typedef pair<ll, pll> plp;
typedef pair<pll, int> ppi;
typedef pair<pll, ll> ppl;
typedef pair<pll, pll> ppp;
typedef vector<int> vi;
typedef vector<ll> vll;

const int maxn = 5e5 + 10000;
const ll inf = 2e18, mod1 = 1e9 + 7, mod2 = 1e9 + 9, delta = 1380;

struct HASH
{
	ll h1, h2, sz;
	HASH(ll H1 = 0, ll H2 = 0, ll SZ = 0)
	{
		h1 = H1;
		h2 = H2;
		sz = SZ;
	}
	bool operator<(const HASH& o) const
	{
		if (h1 ^ o.h1)
			return (h1 < o.h1);
		if (h2 ^ o.h2)
			return (h2 < o.h2);
		return (sz < o.sz);
	}
};

int n, cur;
ll pw1[maxn], pw2[maxn];
HASH down[maxn], up[maxn];
pii ans = mp(-1, -1);
map<HASH, int> cnt;
vi graph[maxn];

HASH operator+(HASH a, HASH b)
{
	a.h1 = a.h1 * pw1[b.sz] % mod1;
	a.h1 += b.h1;
	a.h1 %= mod1;
	a.h2 = a.h2 * pw2[b.sz] % mod2;
	a.h2 += b.h2;
	a.h2 %= mod2;
	a.sz += b.sz;
	return a;
}

HASH envelope(HASH a)
{
	a.h1 += pw1[a.sz];
	a.h1 %= mod1;
	a.h2 += pw2[a.sz];
	a.h2 %= mod2;
	a.h1 = a.h1 * delta % mod1;
	a.h1 = a.h2 * delta % mod2;
	a.sz += 2;
	return a;
}

void dfsdown(int u, int prev)
{
	vector<HASH> vec;
	for (int i : graph[u])
		if (i ^ prev)
		{
			dfsdown(i, u);
			vec.pb(down[i]);
		}
	sort(all(vec));
	for (auto i : vec)
		down[u] = down[u] + i;
	down[u] = envelope(down[u]);
}

void dfsup(int u, int prev)
{
	vector<pair<HASH, int> > vec;
	vec.pb(mp(up[u], u));
	for (int i : graph[u])
		if (i ^ prev)
			vec.pb(mp(down[i], i));
	sort(all(vec));
	vector<HASH> pref(vec.size()), suf(vec.size());
	fori (i, 0, vec.size())
	{
		pref[i] = vec[i].ff;
		if (i)
			pref[i] = pref[i - 1] + pref[i];
	}
	forb (i, vec.size() - 1, 0)
	{
		suf[i] = vec[i].ff;
		if (i < (int)vec.size() - 1)
			suf[i] = suf[i] + suf[i + 1];
	}
	fori (i, 0, vec.size())
		if (vec[i].ss ^ u)
		{
			int now = vec[i].ss;
			if (i)
				up[now] = pref[i - 1];
			if (i < (int)vec.size() - 1)
				up[now] = up[now] + suf[i + 1];
			up[now] = envelope(up[now]);
		}
	for (int i : graph[u])
		if (i ^ prev)
			dfsup(i, u);
}

inline void add(HASH val)
{
	if (!cnt[val])
		cur++;
	cnt[val]++;
}

inline void rem(HASH val)
{
	cnt[val]--;
	if (!cnt[val])
		cur--;
}

void dfs(int u, int prev)
{
	ans = max(ans, mp(cur, u));
	for (int i : graph[u])
		if (i ^ prev)
		{
			rem(down[u]);
			add(up[i]);
			dfs(i, u);
			rem(up[i]);
			add(down[u]);
		}
}

int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(0);

	pw1[0] = 1;
	pw2[0] = 1;
	fori (i, 1, maxn)
	{
		pw1[i] = pw1[i - 1] * delta % mod1;
		pw2[i] = pw2[i - 1] * delta % mod2;
	}

	cin >> n;
	int u, v;
	fori (i, 1, n)
	{
		cin >> u >> v;
		graph[--u].pb(--v);
		graph[v].pb(u);
	}
	dfsdown(0, -1);
	dfsup(0, -1);
	fori (i, 0, n)
		add(down[i]);
	dfs(0, -1);
	cout << ans.ss + 1 << endl;
}















