/*
  Zenit CK 2011/2012, uloha g)
  Riesenie by Zemco

  Skusame vsetky moznosti skupiny ludi. Danu skupinu vyskusame,
  ci kazdy schopnost vie niekto a ak ano, zistime
  ci nie je lacnejsia/skor v abecede ako ta, ktoru pozname doteraz.

  Zo zadania mame predpoklad, ze nejake riesenie existuje.
  Cas riesenia: 2^N * ( dake polynomialne drobne typu N*(logN + MlogM) )
   */

#include <iostream>
#include <map>
#include <set>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;

typedef vector<string> VS;

#define FOR(i,N) for(int i=0;i<(int)N;i++)
#define PB push_back

int N,M;
set<string> current,best,kandidat;
//vstup. pre dane meno si pamatame vo vektore nazvy jeho schopnosti
map<string,VS> MP;
VS mena;

int main(){
  cin >> M;
  string s;
  FOR(i,M) cin >> s;
  cin >> N;
  FOR(i,N){
    int x;
    cin >> x >> s;
    mena.PB( s );
    VS schopnost;
    FOR(i,x){
      string sch;
      cin >> sch;
      schopnost.PB(sch);
    }
    MP[s] = schopnost;
  }

  //dummy riesenie, horsie od vsetkeho
  FOR(i,N+1) best.insert( string(i+3,'z') );

  //skusime skupinu ludi danu binarnym zapisom cisla 'i'
  FOR(i,(1<<N)){
    current.clear();
    kandidat.clear();
    //zrekonstruujeme set skillov, ktory ma dana mnozina ludi
    FOR(j,N) if (i & (1<<j)){
      kandidat.insert( mena[j] );
      FOR(k,MP[mena[j]].size()) current.insert( MP[mena[j]][k] );
    }
    //mnozina je vyhovujuca, ak tam je M roznych skillov
    if ( (int)current.size() == M ){
      if (kandidat.size() > best.size()) continue;
      //vyuzijeme to, ze v pripade rovnosti velkosti mnozin robi comparator '<' presne to co chceme - porovnava lexikograficky
      if (kandidat.size() < best.size()) best = kandidat;
      else best = kandidat < best ? kandidat : best;
    }
  }

  for(set<string>::iterator it = best.begin(); it != best.end(); it++){
    if (it != best.begin()) cout << " ";
    cout << *it;
  }
  cout << endl;
  return 0;
}