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>
using namespace std;
const int maxn = 1e5 + 10;
set<int> in[maxn], out[maxn];
queue<int> q;
vector<pair<pair<long long, long long>, int> > v[maxn];
map<pair<long long, long long>, int> M;
const long long seed = 131;
long long mod[2] = {1000000007, 1000000009};
long long P[2][maxn];
void pre() {
  for (int t = 0; t <= 1; t++) {
    P[t][0] = 1;
    for (int i = 1; i < maxn; i++) P[t][i] = P[t][i - 1] * seed % mod[t];
  }
}
int cnt, h[maxn];
struct edge {
  int to, pre;
} e[maxn << 1];
void add(int from, int to) {
  cnt++;
  e[cnt].pre = h[from];
  e[cnt].to = to;
  h[from] = cnt;
}
void show(int to, pair<pair<long long, long long>, int> h) {
  int from = h.second;
  pair<long long, long long> ha = h.first;
  printf("%d -> %d : %I64d %I64d\n", from, to, ha.first, ha.second);
}
vector<pair<long long, long long> > rev[maxn];
pair<long long, long long> dfs1(int x, int f) {
  pair<long long, long long> ret;
  for (int i = 0; i < v[x].size(); i++) {
    int to = v[x][i].second;
    if (to == f) {
      rev[x].push_back(pair<long long, long long>(0, 0));
      ret = v[x][i].first;
      continue;
    }
    M[v[x][i].first]++;
    pair<long long, long long> tmp = dfs1(to, x);
    rev[x].push_back(tmp);
  }
  return ret;
}
int Ma, ans;
void dfs2(int x, int f) {
  if ((int)M.size() > Ma) Ma = M.size(), ans = x;
  for (int i = 0; i < v[x].size(); i++) {
    int to = v[x][i].second;
    if (to == f) continue;
    M[rev[x][i]]++;
    M[v[x][i].first]--;
    if (M[v[x][i].first] == 0) M.erase(v[x][i].first);
    dfs2(to, x);
    M[rev[x][i]]--;
    if (M[rev[x][i]] == 0) M.erase(rev[x][i]);
    M[v[x][i].first]++;
  }
}
int n, siz[maxn];
map<pair<long long, long long>, int> sz;
void SZ(int x, int f) {
  siz[x] = 1;
  for (int i = h[x]; i; i = e[i].pre) {
    int to = e[i].to;
    if (to == f) continue;
    SZ(to, x);
    siz[x] += siz[to];
    sz[pair<long long, long long>(to, x)] = siz[to];
    sz[pair<long long, long long>(x, to)] = n - siz[to];
  }
}
int main(void) {
  pre();
  scanf("%d", &n);
  for (int i = 1; i < n; i++) {
    int u, v;
    scanf("%d %d", &u, &v);
    add(u, v);
    out[u].insert(v);
    in[v].insert(u);
    add(v, u);
    out[v].insert(u);
    in[u].insert(v);
  }
  if (n == 1) {
    puts("1");
    return 0;
  }
  SZ(1, 0);
  for (int i = 1; i <= n; i++)
    if (in[i].size() <= 1) q.push(i);
  while (!q.empty()) {
    int tmp = q.front();
    q.pop();
    if (!in[tmp].size()) {
      if (!out[tmp].size()) continue;
      sort(v[tmp].begin(), v[tmp].end());
      int len = v[tmp].size();
      pair<long long, long long> l = pair<long long, long long>(0, len),
                                 r = pair<long long, long long>(0, 0);
      for (int i = 1; i < len; i++) {
        r.first = (r.first * seed + v[tmp][i].first.first) % mod[0];
        r.second = (r.second * seed + v[tmp][i].first.second) % mod[1];
      }
      if (out[tmp].find(v[tmp][0].second) != out[tmp].end()) {
        int to = v[tmp][0].second;
        pair<pair<long long, long long>, int> nhash;
        nhash.second = tmp;
        nhash.first.first =
            (l.first * P[0][len - 1] + r.first +
             sz[pair<long long, long long>(tmp, to)] * P[0][len - 1]) %
            mod[0];
        nhash.first.second = (l.second * P[1][len - 1] + r.second) % mod[1];
        v[to].push_back(nhash);
        out[tmp].erase(to);
        in[to].erase(tmp);
        if (in[to].size() <= 1) q.push(to);
      }
      for (int i = 1; i < len; i++) {
        l.first = (l.first * seed + v[tmp][i - 1].first.first) % mod[0];
        l.second = (l.second * seed + v[tmp][i - 1].first.second) % mod[1];
        r.first =
            (r.first - v[tmp][i].first.first * P[0][len - i - 1] % mod[0] +
             mod[0]) %
            mod[0];
        r.second =
            (r.second - v[tmp][i].first.second * P[1][len - i - 1] % mod[1] +
             mod[1]) %
            mod[1];
        int to = v[tmp][i].second;
        if (out[tmp].find(to) == out[tmp].end()) continue;
        pair<pair<long long, long long>, int> nhash;
        nhash.second = tmp;
        nhash.first.first =
            (l.first * P[0][len - i - 1] + r.first +
             sz[pair<long long, long long>(tmp, to)] * P[0][len - 1]) %
            mod[0];
        nhash.first.second = (l.second * P[1][len - i - 1] + r.second) % mod[1];
        v[to].push_back(nhash);
        out[tmp].erase(to);
        in[to].erase(tmp);
        if (in[to].size() <= 1) q.push(to);
      }
    } else {
      int to = *in[tmp].begin();
      int len = v[tmp].size();
      pair<pair<long long, long long>, int> nhash =
          pair<pair<long long, long long>, int>(
              pair<long long, long long>(
                  sz[pair<long long, long long>(tmp, to)], len + 1),
              tmp);
      if (len) {
        sort(v[tmp].begin(), v[tmp].end());
        for (int i = 0; i < len; i++)
          nhash.first.first =
              (nhash.first.first * seed + v[tmp][i].first.first) % mod[0],
          nhash.first.second =
              (nhash.first.second * seed + v[tmp][i].first.second) % mod[1];
      }
      v[to].push_back(nhash);
      out[tmp].erase(to);
      in[to].erase(tmp);
      if (in[to].size() <= 1) q.push(to);
    }
  }
  M.clear();
  dfs1(1, 0);
  Ma = 0;
  dfs2(1, 0);
  printf("%d\n", ans);
  return 0;
}
