#include <bits/stdc++.h>
using namespace std;
const long long int M = 1e6 + 7;
const long long int mod = 1e9 + 7;
const long long int infi = LLONG_MAX;
long long int k, n, x, y, m, mymax = LLONG_MIN, mymin = LLONG_MAX, b, c, z, sum,
                             cnt, dp[M];
vector<string> ans;
struct node {
  long long int value;
  unordered_map<char, long long int> nxt;
} trie[M];
string s[M];
long long int insert(long long int id) {
  long long int i = 0, curr = 0;
  while (i < s[id].size()) {
    if (trie[curr].nxt.find(tolower(s[id][i])) == trie[curr].nxt.end()) {
      trie[curr].nxt[tolower(s[id][i])] = cnt++;
      trie[cnt].value = 0;
    }
    curr = trie[curr].nxt[tolower(s[id][i])];
    i++;
  }
  trie[curr].value = id;
  return 0;
}
long long int check(long long int id, long long int tid) {
  if (id < 0) {
    return 0;
  }
  if (trie[tid].nxt.find(s[0][id]) == trie[tid].nxt.end()) return 0;
  tid = trie[tid].nxt[s[0][id]];
  if (trie[tid].value != 0) {
    if (id > 0 && dp[id - 1] != 0 || id == 0) {
      return trie[tid].value;
    }
  }
  return check(id - 1, tid);
}
int main() {
  long long int i, j;
  scanf("%lld", &n);
  cnt = 1;
  cin >> s[0];
  scanf("%lld", &m);
  for (i = 1; i < m + 1; i++) {
    cin >> s[i];
    insert(i);
  }
  dp[0] = 0;
  i = 0;
  while (i < n) {
    dp[i] = check(i, 0);
    i++;
  }
  i = n - 1;
  while (i >= 0) {
    ans.push_back(s[dp[i]]);
    i -= s[dp[i]].size();
  }
  i = ans.size() - 1;
  while (i >= 0) {
    cout << ans[i] << ' ';
    i--;
  }
  cout << endl;
  return 0;
}
