#include <bits/stdc++.h>
using namespace std;
const long double epsilon = 1e-9;
class weapon {
 public:
  string name;
  string type;
  int atk, def, res;
  int space;
  vector<string> residents;
  friend ostream& operator<<(ostream& out, const weapon& w);
};
ostream& operator<<(ostream& out, const weapon& w) {
  out << w.name << " " << w.residents.size();
  for (int i = 0; i < w.residents.size(); i++) out << " " << w.residents[i];
  return out;
}
class resident {
 public:
  string name;
  string type;
  int amount;
  int idx;
};
void increase(weapon& w, const resident& r) {
  w.residents.push_back(r.name);
  if (r.type == "gladiator")
    w.atk += r.amount;
  else if (r.type == "sentry")
    w.def += r.amount;
  else
    w.res += r.amount;
}
weapon bestWeapon(const vector<weapon>& v) {
  int best = -1;
  int bestIdx = 0;
  for (int i = 0; i < v.size(); i++) {
    if (v[i].type == "weapon" && v[i].atk > best) {
      best = v[i].atk;
      bestIdx = i;
    }
  }
  return v[bestIdx];
}
weapon bestArmor(const vector<weapon>& v) {
  int best = -1;
  int bestIdx = 0;
  for (int i = 0; i < v.size(); i++) {
    if (v[i].type == "armor" && v[i].def > best) {
      best = v[i].def;
      bestIdx = i;
    }
  }
  return v[bestIdx];
}
weapon bestOrb(const vector<weapon>& v) {
  int best = -1;
  int bestIdx = 0;
  for (int i = 0; i < v.size(); i++) {
    if (v[i].type == "orb" && v[i].res > best) {
      best = v[i].res;
      bestIdx = i;
    }
  }
  return v[bestIdx];
}
vector<bool> used;
vector<resident> findBestResidents(const weapon& w, const vector<resident>& v) {
  string type;
  if (w.type == "weapon")
    type = "gladiator";
  else if (w.type == "armor")
    type = "sentry";
  else
    type = "physician";
  int sz = w.space;
  priority_queue<pair<int, int>, vector<pair<int, int> >,
                 greater<pair<int, int> > >
      q;
  for (int i = 0; i < v.size(); i++) {
    if (v[i].type == type && (q.size() < sz || v[i].amount > q.top().first)) {
      q.push(make_pair(v[i].amount, i));
      if (q.size() > sz) q.pop();
    }
  }
  vector<resident> toRet;
  while (!q.empty()) {
    toRet.push_back(v[q.top().second]);
    q.pop();
  }
  return toRet;
}
int estimateWeapon(const weapon& w, const vector<resident>& v) {
  vector<resident> res(findBestResidents(w, v));
  int rs = 0;
  if (w.type == "weapon")
    rs = w.atk;
  else if (w.type == "armor")
    rs = w.def;
  else
    rs = w.res;
  for (int i = 0; i < res.size(); i++) rs += res[i].amount;
  return rs;
}
void addToWeapon(weapon& w, const vector<resident>& v) {
  vector<resident> res(findBestResidents(w, v));
  for (int i = 0; i < res.size(); i++) {
    w.residents.push_back(res[i].name);
    used[res[i].idx] = true;
  }
}
int main() {
  int n;
  cin >> n;
  vector<weapon> v(n);
  map<string, int> weaponMap;
  int totalSpace = 0;
  for (int i = 0; i < n; i++) {
    cin >> v[i].name >> v[i].type >> v[i].atk >> v[i].def >> v[i].res >>
        v[i].space;
    totalSpace += v[i].space;
    weaponMap[v[i].name] = i;
  }
  int m;
  cin >> m;
  vector<resident> residents(m);
  if (m == totalSpace) {
    string owner;
    for (int i = 0; i < m; i++) {
      cin >> residents[i].name >> residents[i].type >> residents[i].amount >>
          owner;
      increase(v[weaponMap[owner]], residents[i]);
    }
    cout << bestWeapon(v) << endl;
    cout << bestArmor(v) << endl;
    cout << bestOrb(v) << endl;
    return 0;
  }
  string owner;
  for (int i = 0; i < m; i++) {
    cin >> residents[i].name >> residents[i].type >> residents[i].amount >>
        owner;
    residents[i].idx = i;
  }
  used.resize(m, false);
  int bestW = -1, bestA = -1, bestO = -1;
  int bestWIdx, bestAIdx, bestOIdx;
  for (int i = 0; i < v.size(); i++) {
    int est = estimateWeapon(v[i], residents);
    if (v[i].type == "weapon") {
      if (bestW < est) {
        bestW = est;
        bestWIdx = i;
      }
    } else if (v[i].type == "armor") {
      if (bestA < est) {
        bestA = est;
        bestAIdx = i;
      }
    } else {
      if (bestO < est) {
        bestO = est;
        bestOIdx = i;
      }
    }
  }
  addToWeapon(v[bestWIdx], residents);
  addToWeapon(v[bestAIdx], residents);
  addToWeapon(v[bestOIdx], residents);
  for (int i = 0; i < residents.size(); i++) {
    if (!used[i]) {
      if (v[bestWIdx].residents.size() < v[bestWIdx].space)
        v[bestWIdx].residents.push_back(residents[i].name);
      else if (v[bestAIdx].residents.size() < v[bestAIdx].space)
        v[bestAIdx].residents.push_back(residents[i].name);
      else if (v[bestOIdx].residents.size() < v[bestOIdx].space)
        v[bestOIdx].residents.push_back(residents[i].name);
    }
  }
  cout << v[bestWIdx] << endl;
  cout << v[bestAIdx] << endl;
  cout << v[bestOIdx] << endl;
  return 0;
}
