#include <bits/stdc++.h>
using namespace std;
const int maxN = 3e5 + 10;
struct Trie {
  int trans[26], size;
} st[maxN * 2 + 1];
int n, cnt;
int dep[maxN + 1], ans[maxN + 1], tot[maxN + 1];
inline void dfs(int u) {
  tot[dep[u]]++;
  st[u].size = 1;
  for (int i = 0; i < 26; i++) {
    int v = st[u].trans[i];
    if (!v) continue;
    dep[v] = dep[u] + 1;
    dfs(v);
    st[u].size += st[v].size;
  }
}
inline int merge(int u, int v) {
  if (!u || !v) return u | v;
  int node;
  if (u > n)
    node = u;
  else if (v > n)
    node = v;
  else
    node = ++cnt;
  st[node].size = 1;
  for (int i = 0; i < 26; i++) {
    st[node].trans[i] = merge(st[u].trans[i], st[v].trans[i]);
    st[node].size += st[st[node].trans[i]].size;
  }
  return node;
}
int main() {
  scanf("%d", &n);
  for (int i = 1; i < n; i++) {
    int x, y;
    char s[2];
    scanf("%d %d %s", &x, &y, s);
    st[x].trans[s[0] - 'a'] = y;
  }
  dfs(1);
  for (int i = 1; i <= n; i++) {
    cnt = n;
    int root = ++cnt;
    for (int j = 0; j < 26; j++) st[root].trans[j] = 0;
    for (int j = 0; j < 26; j++) {
      int u = st[i].trans[j];
      if (!u) continue;
      for (int k = 0; k < 26; k++)
        st[root].trans[k] = merge(st[root].trans[k], st[u].trans[k]);
    }
    for (int j = 0; j < 26; j++) ans[dep[i] + 1] += st[st[root].trans[j]].size;
  }
  int sum = 1;
  for (int i = 1; i <= n; i++) ans[i] += sum, sum += tot[i];
  int mx = 1;
  for (int i = 1; i <= n; i++)
    if (ans[i] < ans[mx]) mx = i;
  printf("%d\n%d\n", ans[mx], mx);
  return 0;
}
