#include <bits/stdc++.h>
using namespace std;
int n, k;
map<string, int> classes;
map<string, int> itemnum;
map<string, int> typesresident;
vector<pair<int, string> > residents[3];
bool used[3][1005];
vector<string> resnoswap[105];
string itemnames[105];
vector<string> sola;
vector<string> solb;
vector<string> solc;
int types[105];
int szes[105];
int atk[105];
int def[105];
int res[105];
int cursums[105][3];
int curszes[105];
int main() {
  cin >> n;
  classes.insert({"weapon", 0});
  classes.insert({"armor", 1});
  classes.insert({"orb", 2});
  typesresident.insert({"gladiator", 0});
  typesresident.insert({"sentry", 1});
  typesresident.insert({"physician", 2});
  string s1, s2;
  int indw, inda, indo;
  int maxw = 0, maxa = 0, maxo = 0;
  int a, b, c, d;
  for (int i = 0; i < n; i++) {
    cin >> s1 >> s2;
    itemnum.insert({s1, i});
    itemnames[i] = s1;
    types[i] = classes[s2];
    cin >> a >> b >> c >> d;
    atk[i] = a;
    def[i] = b;
    res[i] = c;
    szes[i] = d;
    if (types[i] == 0) {
      indw = i;
    } else if (types[i] == 1) {
      inda = i;
    } else {
      indo = i;
    }
  }
  cin >> k;
  string s3;
  for (int i = 0; i < k; i++) {
    cin >> s1 >> s2 >> a >> s3;
    residents[typesresident[s2]].push_back({a, s1});
    cursums[itemnum[s3]][typesresident[s2]] += a;
    curszes[itemnum[s3]]++;
    resnoswap[itemnum[s3]].push_back(s1);
  }
  for (int i = 0; i < 3; i++) {
    sort(residents[i].begin(), residents[i].end());
    reverse(residents[i].begin(), residents[i].end());
    for (int j = 1; j < residents[i].size(); j++) {
      residents[i][j].first += residents[i][j - 1].first;
    }
  }
  bool posswap = false;
  for (int i = 0; i < n; i++) {
    if (curszes[i] < szes[i]) {
      posswap = true;
    }
  }
  if (posswap) {
    for (int i = 0; i < n; i++) {
      if (types[i] == 0) {
        if (szes[i] > 0 && !residents[0].empty() &&
            atk[i] +
                    residents[0][min(szes[i], (int)residents[0].size() - 1) - 1]
                        .first >
                maxw) {
          maxw = atk[i] +
                 residents[0][min(szes[i], (int)residents[0].size() - 1) - 1]
                     .first;
          indw = i;
        } else if (atk[i] > maxw) {
          maxw = atk[i];
          indw = i;
        }
      } else if (types[i] == 1) {
        if (szes[i] > 0 && !residents[1].empty() &&
            def[i] +
                    residents[1][min(szes[i], (int)residents[1].size() - 1) - 1]
                        .first >
                maxa) {
          maxa = def[i] +
                 residents[1][min(szes[i], (int)residents[1].size() - 1) - 1]
                     .first;
          inda = i;
        } else if (def[i] > maxa) {
          maxa = def[i];
          inda = i;
        }
      } else {
        if (szes[i] > 0 && !residents[2].empty() &&
            res[i] +
                    residents[2][min(szes[i], (int)residents[2].size() - 1) - 1]
                        .first >
                maxo) {
          maxo = res[i] +
                 residents[2][min(szes[i], (int)residents[2].size() - 1) - 1]
                     .first;
          indo = i;
        } else if (res[i] > maxo) {
          maxo = res[i];
          indo = i;
        }
      }
    }
    for (int i = 0; i < min(szes[indw], (int)residents[0].size()); i++) {
      sola.push_back(residents[0][i].second);
      used[0][i] = true;
    }
    for (int i = 0; i < min(szes[inda], (int)residents[1].size()); i++) {
      solb.push_back(residents[1][i].second);
      used[1][i] = true;
    }
    for (int i = 0; i < min(szes[indo], (int)residents[2].size()); i++) {
      solc.push_back(residents[2][i].second);
      used[2][i] = true;
    }
    for (int i = 0; i < residents[0].size(); i++) {
      if (!used[0][i]) {
        if (solb.size() < szes[inda]) {
          solb.push_back(residents[0][i].second);
          used[0][i] = true;
        } else if (solc.size() < szes[indo]) {
          solc.push_back(residents[0][i].second);
          used[0][i] = true;
        } else {
          break;
        }
      }
    }
    for (int i = 0; i < residents[1].size(); i++) {
      if (!used[1][i]) {
        if (sola.size() < szes[indw]) {
          sola.push_back(residents[1][i].second);
          used[1][i] = true;
        } else if (solc.size() < szes[indo]) {
          solc.push_back(residents[1][i].second);
          used[1][i] = true;
        } else {
          break;
        }
      }
    }
    for (int i = 0; i < residents[2].size(); i++) {
      if (!used[2][i]) {
        if (sola.size() < szes[indw]) {
          sola.push_back(residents[2][i].second);
          used[2][i] = true;
        } else if (solb.size() < szes[inda]) {
          sola.push_back(residents[2][i].second);
          used[2][i] = true;
        } else {
          break;
        }
      }
    }
    sort(sola.begin(), sola.end());
    sort(solb.begin(), solb.end());
    sort(solc.begin(), solc.end());
    cout << itemnames[indw] << " " << sola.size() << " ";
    for (int i = 0; i < sola.size(); i++) {
      cout << sola[i] << " ";
    }
    cout << endl;
    cout << itemnames[inda] << " " << solb.size() << " ";
    for (int i = 0; i < solb.size(); i++) {
      cout << solb[i] << " ";
    }
    cout << endl;
    cout << itemnames[indo] << " " << solc.size() << " ";
    for (int i = 0; i < solc.size(); i++) {
      cout << solc[i] << " ";
    }
    cout << endl;
  } else {
    for (int i = 0; i < n; i++) {
      if (types[i] == 0) {
        if (atk[i] + cursums[i][0] > maxw) {
          maxw = atk[i] + cursums[i][0];
          indw = i;
        }
      } else if (types[i] == 1) {
        if (def[i] + cursums[i][1] > maxa) {
          maxa = def[i] + cursums[i][1];
          inda = i;
        }
      } else {
        if (res[i] + cursums[i][2] > maxo) {
          maxo = res[i] + cursums[i][2];
          indo = i;
        }
      }
    }
    cout << itemnames[indw] << " " << szes[indw] << " ";
    for (int i = 0; i < szes[indw]; i++) {
      cout << resnoswap[indw][i] << " ";
    }
    cout << endl;
    cout << itemnames[inda] << " " << szes[inda] << " ";
    for (int i = 0; i < szes[inda]; i++) {
      cout << resnoswap[inda][i] << " ";
    }
    cout << endl;
    cout << itemnames[indo] << " " << szes[indo] << " ";
    for (int i = 0; i < szes[indo]; i++) {
      cout << resnoswap[indo][i] << " ";
    }
    cout << endl;
  }
}
