#include <bits/stdc++.h>
using namespace std;
struct node {
  string name;
  int att, def, res, size, now;
  vector<string> ans;
};
struct node3 {
  int k, type;
};
struct node2 {
  string name;
  int id, type, data;
  node3 belong;
};
node a[3][120];
node2 b[3][1200], ball[1200];
int ttp[1200], ttq[1200];
int n, m, n1, n2, n3, m1, m2, m3, nn;
int ans1, ans2, ans3;
map<string, node3> ma;
void out(int p, int k) {
  int tmp;
  cout << a[p][k].name << ' ' << a[p][k].now;
  for (int i = 0; i < a[p][k].now; ++i) cout << ' ' << a[p][k].ans[i];
  cout << endl;
}
bool cmp(node2 a, node2 b) { return a.data > b.data; }
void gao(node2 aa) {
  if (a[0][ans1].now < a[0][ans1].size) {
    a[0][ans1].now++;
    a[0][ans1].ans.push_back(aa.name);
    return;
  }
  if (a[1][ans2].now < a[1][ans2].size) {
    a[1][ans2].now++;
    a[1][ans2].ans.push_back(aa.name);
    return;
  }
  if (a[2][ans3].now < a[2][ans3].size) {
    a[2][ans3].now++;
    a[2][ans3].ans.push_back(aa.name);
    return;
  }
}
int main() {
  ma.clear();
  n1 = n2 = n3 = 0;
  scanf("%d", &n);
  node tmp;
  string type;
  node3 tk;
  for (int i = 1; i <= n; ++i) {
    cin >> tmp.name >> type;
    scanf("%d%d%d%d", &tmp.att, &tmp.def, &tmp.res, &tmp.size);
    tmp.ans.clear();
    tmp.now = 0;
    if (type == "weapon") {
      a[0][++n1] = tmp;
      tk.type = 0;
      tk.k = n1;
    }
    if (type == "armor") {
      a[1][++n2] = tmp;
      tk.type = 1;
      tk.k = n2;
    }
    if (type == "orb") {
      a[2][++n3] = tmp;
      tk.type = 2;
      tk.k = n3;
    }
    ma[tmp.name] = tk;
  }
  scanf("%d", &m);
  node2 tp;
  int ll;
  string belong;
  for (int i = 1; i <= m; ++i) {
    cin >> tp.name >> type >> tp.data >> belong;
    tp.id = i;
    tk = ma[belong];
    tp.belong = tk;
    a[tk.type][tk.k].now++;
    if (type == "gladiator") {
      tp.type = 0;
      b[0][++m1] = tp;
    }
    if (type == "sentry") {
      tp.type = 1;
      b[1][++m2] = tp;
    }
    if (type == "physician") {
      tp.type = 2;
      b[2][++m3] = tp;
    }
  }
  sort(b[0] + 1, b[0] + m1 + 1, cmp);
  sort(b[1] + 1, b[1] + m2 + 1, cmp);
  sort(b[2] + 1, b[2] + m3 + 1, cmp);
  bool bbi = true;
  for (int i = 1; i <= n1; ++i)
    if (a[0][i].size > a[0][i].now) bbi = false;
  for (int i = 1; i <= n2; ++i)
    if (a[1][i].size > a[1][i].now) bbi = false;
  for (int i = 1; i <= n3; ++i)
    if (a[2][i].size > a[2][i].now) bbi = false;
  bool bi[3][1002];
  memset(bi, true, sizeof(bi));
  a[0][0].att = a[1][0].def = a[2][0].res = -1;
  ans1 = ans2 = ans3 = 0;
  if (bbi == false) {
    for (int i = 1; i <= n1; ++i) {
      a[0][i].now = min(m1, a[0][i].size);
      for (int j = 1; j <= min(m1, a[0][i].size); ++j) {
        a[0][i].ans.push_back(b[0][j].name);
        a[0][i].att += b[0][j].data;
      }
      if (a[0][i].att > a[0][ans1].att) ans1 = i;
    }
    for (int i = 1; i <= n2; ++i) {
      a[1][i].now = min(m2, a[1][i].size);
      for (int j = 1; j <= min(m2, a[1][i].size); ++j) {
        a[1][i].ans.push_back(b[1][j].name);
        a[1][i].def += b[1][j].data;
      }
      if (a[1][i].def > a[1][ans2].def) ans2 = i;
    }
    for (int i = 1; i <= n3; ++i) {
      a[2][i].now = min(m3, a[2][i].size);
      for (int j = 1; j <= min(m3, a[2][i].size); ++j) {
        a[2][i].ans.push_back(b[2][j].name);
        a[2][i].res += b[2][j].data;
      }
      if (a[2][i].res > a[2][ans3].res) ans3 = i;
    }
    for (int i = 1; i <= a[0][ans1].now; ++i) bi[0][i] = false;
    for (int i = 1; i <= a[1][ans2].now; ++i) bi[1][i] = false;
    for (int i = 1; i <= a[2][ans3].now; ++i) bi[2][i] = false;
    for (int i = 1; i <= m1; ++i)
      if (bi[0][i]) gao(b[0][i]);
    for (int i = 1; i <= m2; ++i)
      if (bi[1][i]) gao(b[1][i]);
    for (int i = 1; i <= m3; ++i)
      if (bi[2][i]) gao(b[2][i]);
  } else {
    for (int i = 1; i <= m1; ++i) {
      tk = b[0][i].belong;
      a[tk.type][tk.k].ans.push_back(b[0][i].name);
      if (tk.type == 0) a[tk.type][tk.k].att += b[0][i].data;
    }
    for (int i = 1; i <= m2; ++i) {
      tk = b[1][i].belong;
      a[tk.type][tk.k].ans.push_back(b[1][i].name);
      if (tk.type == 1) a[tk.type][tk.k].def += b[1][i].data;
    }
    for (int i = 1; i <= m3; ++i) {
      tk = b[2][i].belong;
      a[tk.type][tk.k].ans.push_back(b[2][i].name);
      if (tk.type == 2) a[tk.type][tk.k].res += b[2][i].data;
    }
    for (int i = 1; i <= n1; ++i)
      if (a[0][i].att > a[0][ans1].att) ans1 = i;
    for (int i = 1; i <= n2; ++i)
      if (a[1][i].def > a[1][ans2].def) ans2 = i;
    for (int i = 1; i <= n3; ++i)
      if (a[2][i].res > a[2][ans3].res) ans3 = i;
  }
  out(0, ans1);
  out(1, ans2);
  out(2, ans3);
  return 0;
}
