#include <bits/stdc++.h>
using namespace std;
int pw[2][200015];
const int BASE[2] = {223, 233};
const int MOD[2] = {1000000007, 1000000009};
int n, x, y, ans, ansn;
vector<int> v[100005];
void prepare() {
  pw[0][0] = pw[1][0] = 1;
  for (int i = 0; i <= 1; ++i)
    for (int j = 1; j <= 200010; ++j)
      pw[i][j] = 1LL * pw[i][j - 1] * BASE[i] % MOD[i];
}
struct TreeHash {
  int w[2], siz;
  TreeHash operator+(const TreeHash &x) const {
    int tmp[2];
    for (int i = 0; i <= 1; ++i)
      tmp[i] = (1LL * pw[i][x.siz] * w[i] + x.w[i]) % MOD[i];
    return TreeHash{tmp[0], tmp[1], siz + x.siz};
  }
  bool operator<(const TreeHash &x) const {
    if (w[0] != x.w[0]) return w[0] < x.w[0];
    if (w[1] != x.w[1]) return w[1] < x.w[1];
    return siz < x.siz;
  }
  bool operator==(const TreeHash &x) const {
    return w[0] == x.w[0] && w[1] == x.w[1] && siz == x.siz;
  }
};
TreeHash f[100005];
map<TreeHash, int> mp;
void add(TreeHash x) { mp[x]++; }
void del(TreeHash x) {
  mp[x]--;
  if (mp[x] == 0) mp.erase(x);
}
void dfs(int x, int fa) {
  vector<TreeHash> nxt;
  nxt.clear();
  for (int i = 0; i < v[x].size(); ++i) {
    int y = v[x][i];
    if (y == fa) continue;
    dfs(y, x);
    nxt.push_back(f[y]);
  }
  f[x] = TreeHash{'(', '(', 1};
  sort(nxt.begin(), nxt.end());
  for (int i = 0; i < nxt.size(); ++i) f[x] = f[x] + nxt[i];
  f[x] = f[x] + TreeHash{')', ')', 1};
}
void work(int x, int fa, TreeHash pre) {
  vector<pair<TreeHash, int> > nxt;
  for (int i = 0; i < v[x].size(); ++i) {
    int y = v[x][i];
    if (y == fa)
      nxt.push_back(make_pair(pre, y));
    else
      nxt.push_back(make_pair(f[y], y));
  }
  TreeHash dq = TreeHash{'(', '(', 1};
  sort(nxt.begin(), nxt.end());
  for (int i = 0; i < nxt.size(); ++i) dq = dq + nxt[i].first;
  del(f[x]);
  add(dq);
  if (ansn < mp.size()) {
    ans = x;
    ansn = mp.size();
  }
  vector<TreeHash> pre1(nxt.size()), suf1(nxt.size());
  if (!nxt.empty()) pre1.front() = suf1.back() = TreeHash{0, 0, 0};
  for (int i = 0; i < nxt.size() - 1; ++i) pre1[i + 1] = pre1[i] + nxt[i].first;
  for (int i = nxt.size() - 1; i > 0; --i) suf1[i - 1] = nxt[i].first + suf1[i];
  for (int i = 0; i < nxt.size(); ++i) {
    int y = nxt[i].second;
    if (y == fa) continue;
    TreeHash now =
        TreeHash{'(', '(', 1} + pre1[i] + suf1[i] + TreeHash{')', ')', 1};
    del(dq);
    add(now);
    work(y, x, now);
    del(now);
    add(dq);
  }
  del(dq);
  add(f[x]);
}
int main() {
  prepare();
  scanf("%d", &n);
  for (int i = 1; i < n; ++i) {
    scanf("%d%d", &x, &y);
    v[x].push_back(y);
    v[y].push_back(x);
  }
  if (n == 1) {
    cout << "1" << endl;
    return 0;
  }
  dfs(1, 0);
  mp.clear();
  for (int i = 1; i <= n; ++i) add(f[i]);
  work(1, 0, {0, 0, 0});
  printf("%d\n", ans);
  return 0;
}
