#include <bits/stdc++.h>
#pragma comment(linker, "/STACK:16777216")
using namespace std;
template <class T>
T abs(T x) {
  return x > 0 ? x : -x;
}
int n;
map<string, int> m;
string name[1000];
vector<pair<int, int> > v[50];
int col[100][100];
int a, b, c;
int p;
void add(string s) {
  if (m.count(s)) return;
  m[s] = p;
  name[p] = s;
  p++;
}
void parse(string s, int pos) {
  replace((s).begin(), (s).end(), ':', ' ');
  replace((s).begin(), (s).end(), ',', ' ');
  istringstream sin(s);
  string o;
  sin >> o;
  add(o);
  string tmp;
  int x;
  while (sin >> tmp >> x) {
    int p = m[tmp];
    v[pos].push_back(make_pair(p, x));
  }
}
int main() {
  cin >> n;
  cin >> a >> b >> c;
  char str[100000];
  gets(str);
  for (int i = 0; i < (a); i++) {
    gets(str);
    add(str);
  }
  for (int i = 0; i < (b); i++) {
    gets(str);
    parse(str, i);
  }
  for (int o = 0; o < (c); o++) {
    int x;
    string s;
    cin >> x >> s;
    x--;
    int p = m[s];
    col[x][p]++;
    for (int i = 0; i < (b); i++) {
      int f = 1;
      for (int j = 0; j < (((int)(v[i]).size())); j++) {
        pair<int, int> tmp = v[i][j];
        if (col[x][tmp.first] < tmp.second) f = 0;
      }
      if (f) {
        for (int j = 0; j < (((int)(v[i]).size())); j++) {
          pair<int, int> tmp = v[i][j];
          col[x][tmp.first] -= tmp.second;
        }
      }
      if (f) col[x][a + i]++;
    }
  }
  for (int i = 0; i < (n); i++) {
    vector<pair<string, int> > res;
    for (int j = 0; j < (a + b); j++)
      if (col[i][j] > 0) res.push_back(make_pair(name[j], col[i][j]));
    sort((res).begin(), (res).end());
    cout << ((int)(res).size()) << endl;
    for (int i = 0; i < (((int)(res).size())); i++)
      cout << res[i].first << ' ' << res[i].second << endl;
  }
  return 0;
}
