// algoritmus Aho-Corasick
// cas O(velkost vstupu)=O(N+M)
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
struct node {bool KONCI; int syn[5]; int mensi,par,pis;};
int main() {
int N,M;
string s;
vector<node> trie; // pismenkovy strom
node n;
for(int i =0; i < 5; i++) n.syn[i] =-1;
n.KONCI =false;
n.mensi =n.par =0;
n.pis ='0';
trie.push_back(n);
cin >> N;
for(int k =0; k < N; k++) {
cin >> s;
int akt =0; // aktualny vrchol v ktorom sme
for(unsigned int i =0; i < s.length(); i++) {
if(trie[akt].syn[s[i]-'1'] == -1) {
trie[akt].syn[s[i]-'1'] =trie.size();
n.par =akt;
n.pis =s[i]-'1';
trie.push_back(n);}
akt =trie[akt].syn[s[i]-'1'];}
trie[akt].KONCI =true;}
// prejdeme vrcholy trie podla rastucej hlbky, hladame prve mensie vrcholy
queue<int> d,q;
q.push(0);
while(!q.empty()) {
for(int i =0; i < 5; i++) if(trie[q.front()].syn[i] != -1) q.push(trie[q.front()].syn[i]);
d.push(q.front());
q.pop();}
while(!d.empty()) {
// najdeme prvy mensi vrchol
trie[d.front()].mensi =trie[trie[d.front()].par].mensi;
while(trie[d.front()].mensi != 0 && trie[trie[d.front()].mensi].syn[trie[d.front()].pis] == -1)
trie[d.front()].mensi =trie[trie[d.front()].mensi].mensi;
if(trie[trie[d.front()].mensi].syn[trie[d.front()].pis] != -1)
trie[d.front()].mensi =trie[trie[d.front()].mensi].syn[trie[d.front()].pis];
if(d.front() == trie[d.front()].mensi) trie[d.front()].mensi =0;
d.pop();}
cin >> M;
bool zac =true;
for(int k =0; k < M; k++) {
cin >> s;
int akt =0;
bool smie =true;
for(unsigned int i =0; i < s.length(); i++) {
// zmen prefix
while(akt != 0 && trie[akt].syn[s[i]-'1'] == -1) akt =trie[akt].mensi;
if(trie[akt].syn[s[i]-'1'] != -1) akt =trie[akt].syn[s[i]-'1'];
// ak tu slovo konci
if(trie[akt].KONCI) {smie =false; break;}}
if(!smie) {
if(zac) zac =false;
else cout << " ";
cout << k+1;}}
cout << endl;
return 0;}