#include <bits/stdc++.h>
using namespace std;
const long long M = 1E9 + 7;
const long long NMAX = 111111;
const long long inf = 1E9;
const long double eps = 1e-2;
struct project {
  string s;
  int v;
  vector<int> pr;
};
bool operator<(project p1, project p2) {
  if (p1.s < p2.s)
    return true;
  else if (p1.s == p2.s) {
    if (p1.v > p2.v) return true;
  }
  return false;
}
project g[NMAX];
int cmp(int i, int j) {
  if (g[i] < g[j])
    return true;
  else
    return false;
}
class cmp2 {
 public:
  int operator()(pair<int, int> a, pair<int, int> b) {
    if (a.first < b.first) return true;
    if (a.first == b.first) return cmp(a.second, b.second);
    return false;
  }
};
struct vertex {
  unordered_map<char, int> to;
  int v = 0;
};
vertex bor[NMAX];
int las = 1;
int add(string &s, int v) {
  int cur = 0;
  for (char c : s) {
    if (bor[cur].to[c] == 0) {
      bor[cur].to[c] = las;
      las++;
    }
    cur = bor[cur].to[c];
  }
  if (bor[cur].v == 0) {
    bor[cur].v = v;
    return 0;
  }
  return bor[cur].v;
}
map<pair<string, int>, int> dict;
vector<pair<string, int>> ans;
void dfs(int v, string &s) {
  if (bor[v].v != 0) {
    ans.push_back({s, bor[v].v});
  }
  for (auto u : bor[v].to) {
    if (u.second != 0) {
      s += u.first;
      dfs(u.second, s);
      s.pop_back();
    }
  }
  return;
}
int main() {
  cin.tie(0);
  cout.tie(0);
  cin.sync_with_stdio(0);
  cout.sync_with_stdio(0);
  int n;
  cin >> n;
  int cur = 1;
  for (int i = 1; i <= n; i++) {
    string s;
    cin >> s;
    int v;
    cin >> v;
    int it = 0;
    if (dict[{s, v}] == 0) {
      g[cur].s = s;
      g[cur].v = v;
      dict[{s, v}] = cur;
      it = cur;
      cur++;
    } else {
      it = dict[{s, v}];
    }
    int m;
    cin >> m;
    for (int j = 1; j <= m; j++) {
      string t;
      cin >> t;
      int u;
      cin >> u;
      if (dict[{t, u}] == 0) {
        g[cur].s = t;
        g[cur].v = u;
        dict[{t, u}] = cur;
        cur++;
      }
      g[it].pr.push_back(dict[{t, u}]);
    }
    sort(g[it].pr.begin(), g[it].pr.end(), cmp);
  }
  set<pair<int, int>, cmp2> q;
  q.insert({0, 1});
  while (!q.empty()) {
    int d = (*q.begin()).first;
    int p = (*q.begin()).second;
    q.erase(q.begin());
    int k = add(g[p].s, g[p].v);
    if (k != 0) continue;
    for (int u : g[p].pr) {
      q.insert({d + 1, u});
    }
  }
  string t = "";
  dfs(0, t);
  cout << ans.size() - 1 << endl;
  sort(ans.begin(), ans.end());
  for (int i = 0; i < ans.size(); i++) {
    if (ans[i].first == g[1].s) continue;
    cout << ans[i].first << ' ' << ans[i].second << endl;
  }
  return 0;
};
