#include <bits/stdc++.h>
using namespace std;
#pragma GCC optimize("O3")
#pragma GCC target("sse4")
const long double PI = acos(-1.0);
const long double EPS = 1e-4;
const long long INF = 1e7 - 1;
const long long mod = 1000000007;
const long long LINF = 1e18 + 10;
const int MAXN = 100001;
const int MAXK = 101;
struct project {
  string nazva;
  int version;
  int cnt;
  int index = -1;
  char name[10];
  vector<project> G;
  void just_this() {
    cnt = 0;
    char ch;
    while (ch = getchar()) {
      if (ch >= 'a' && ch <= 'z')
        name[cnt++] = ch;
      else {
        if (cnt) break;
      }
    }
    nazva.clear();
    for (int i = (0); i < (cnt); ++i) nazva += name[i];
    scanf("%d", &version);
  }
  void read() {
    just_this();
    int x;
    scanf("%d", &x);
    project pr;
    for (int i = (0); i < (x); ++i) {
      pr.just_this();
      G.push_back(pr);
    }
  }
};
int N;
project A[MAXN];
int dist[MAXN];
char used[MAXN];
vector<project> ANS;
map<pair<int, string>, int> mp;
map<string, int> best;
vector<int> levels[MAXN];
vector<int> solve(vector<int> curr_level) {
  map<string, int> ok;
  for (auto i : curr_level) {
    if (A[i].nazva == A[0].nazva) continue;
    if (best[A[i].nazva]) continue;
    int now = ok[A[i].nazva];
    if (now == 0)
      ok[A[i].nazva] = i;
    else {
      if (A[now].version < A[i].version) ok[A[i].nazva] = i;
    }
  }
  vector<int> res;
  for (auto i : ok) res.push_back(i.second), best[i.first] = i.second;
  return res;
}
void bfs() {
  memset(used, 0, sizeof(used));
  memset(dist, 0, sizeof(dist));
  queue<int> q;
  q.push(0);
  used[0] = 1;
  int curr = 1;
  vector<int> level;
  int iter = 1;
  while (!q.empty()) {
    while (!q.empty()) {
      int t = q.front();
      q.pop();
      for (int x = (0); x < ((int)((A[t].G).size())); ++x) {
        int i = A[t].G[x].index;
        if (used[i] == 0) level.push_back(i);
      }
    }
    if ((int)((level).size()) == 0) continue;
    level = solve(level);
    for (auto i : level) {
      used[i] = 1;
      dist[i] = iter;
      q.push(i);
    }
    level.clear();
    ++iter;
  }
}
int comp(project x, project y) {
  int mi = min(x.cnt, y.cnt);
  for (int i = (0); i < (mi); ++i)
    if (x.name[i] > y.name[i])
      return 0;
    else if (x.name[i] < y.name[i])
      return 1;
  return x.cnt < y.cnt;
}
int main() {
  scanf("%d", &N);
  for (int i = (0); i < (N); ++i) {
    A[i].read();
    A[i].index = i;
    mp[make_pair(A[i].version, A[i].nazva)] = i;
  }
  for (int i = (0); i < (N); ++i) {
    for (auto& pr : A[i].G) pr.index = mp[make_pair(pr.version, pr.nazva)];
  }
  bfs();
  for (auto i : best) ANS.push_back(A[i.second]);
  sort(ANS.begin(), ANS.end(), comp);
  cout << (int)((ANS).size()) << endl;
  for (int i = (0); i < ((int)((ANS).size())); ++i) {
    for (int j = (0); j < (ANS[i].cnt); ++j) printf("%c", ANS[i].name[j]);
    printf(" %d\n", ANS[i].version);
  }
  return 0;
}
