#include <bits/stdc++.h>
using namespace std;
const long long Nmax = 1e8;
const long long BASE = 26;
const long long mod = 1e9 + 7;
ifstream fin(".inp");
ofstream fout(".out");
long long n, m;
string s, res;
vector<string> d;
long long dp1[100007], dp2[100007], cnt[100007], f[100007], la, lb, lm;
pair<long long, long long> trace[100007];
string change(string s) {
  for (int i = 0; i < s.length(); ++i)
    if (s[i] < 'a') s[i] = (char)s[i] + 32;
  reverse(s.begin(), s.end());
  return s;
}
long long get(long long i, long long j) {
  return (dp1[i] - dp1[j - 1] * cnt[i - j + 1] + mod * mod) % mod;
}
void truyvet(int k) {
  while (k >= 1) {
    res = (d[trace[k].first]) + res;
    res = ' ' + res;
    k -= trace[k].second;
  }
}
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  cin >> n >> s;
  cin >> m;
  d.assign(m + 1, "");
  s = ' ' + s;
  cnt[0] = 1;
  for (int i = 1; i <= 100000; ++i) cnt[i] = (cnt[i - 1] * 26) % mod;
  for (int i = 1; i <= n; ++i)
    dp1[i] = (dp1[i - 1] * BASE + s[i] - 'a' + 1) % mod;
  map<pair<long long, long long>, int> ma;
  map<pair<long long, long long>, int> m2;
  for (int i = 1; i <= m; ++i) {
    cin >> d[i];
    string f = d[i];
    lb = f.length();
    lm = max(lm, lb);
    f = change(f);
    for (int j = 0; j < lb; ++j)
      dp2[i] = (dp2[i] * BASE + f[j] - 'a' + 1) % mod;
    pair<long long, long long> w = {dp2[i], lb};
    ma[w] = 1;
    m2[w] = i;
  }
  f[0] = 1;
  for (int i = 1; i <= n; ++i) {
    for (int k = 1; k <= lm; ++k) {
      if (k > i) break;
      long long j = i - k + 1;
      long long key = get(i, j);
      if (f[j - 1] && ma[{key, k}]) {
        trace[i] = {m2[{key, k}], k};
        f[i] = 1;
      }
    }
  }
  truyvet(n);
  for (int i = 1; i < res.length(); ++i) cout << res[i];
  return 0;
}
