#include <bits/stdc++.h>
using namespace std;
int n, m;
string s, word[100005], original[100005];
struct name {
  int arr[26];
  int ends;
} trie[1000001];
int nodes = 0;
int glob;
void add_in_trie(string t) {
  int v = 0;
  for (int i = 0; i < t.length(); i++) {
    int ch = t[i] - 'a';
    if (trie[v].arr[ch] == 0) {
      nodes++;
      trie[v].arr[ch] = nodes;
      v = nodes;
    } else
      v = trie[v].arr[ch];
  }
  trie[v].ends = glob;
}
int d[100051];
int from[100051];
vector<int> ans;
int main() {
  cin >> n;
  cin >> s;
  cin >> m;
  for (int i = 1; i <= m; i++) {
    cin >> word[i];
    original[i] = word[i];
    for (int j = 0; j < word[i].length(); j++)
      if (word[i][j] >= 'A' && word[i][j] <= 'Z')
        word[i][j] = char('a' + int(word[i][j] - 'A'));
    reverse(word[i].begin(), word[i].end());
    glob = i;
    add_in_trie(word[i]);
  }
  s = "#" + s;
  d[0] = 1;
  from[0] = -1;
  for (int i = 0; i < s.length(); i++) {
    if (d[i]) {
      int v = 0;
      for (int j = i + 1; j < s.length(); j++) {
        int ch = s[j] - 'a';
        if (trie[v].arr[ch] == 0) break;
        v = trie[v].arr[ch];
        if (trie[v].ends != 0) from[j] = trie[v].ends, d[j] = 1;
      }
    }
  }
  int ind = s.length() - 1;
  while (ind != 0) {
    ans.push_back(from[ind]);
    ind = ind - word[from[ind]].size();
  }
  reverse(ans.begin(), ans.end());
  for (int i = 0; i < ans.size(); i++) cout << original[ans[i]] << " ";
  return 0;
}
