#include <bits/stdc++.h>
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("no-stack-protector")
#pragma GCC target("sse,sse2,ssse3,sse3,sse4,popcnt,avx,mmx,abm,tune=native")
using namespace std;
struct nd;
struct nd {
  string str;
  unordered_map<char, nd *> mp;
  void ins(string &s, string &og, long long pos = 0) {
    if (pos == (long long)s.size())
      str = og;
    else {
      if (!mp.count(s[pos])) mp[s[pos]] = new nd;
      (*mp[s[pos]]).ins(s, og, pos + 1);
    }
  }
};
long long f(long long a, long long b) { return a + b; }
signed main() {
  cin.tie(nullptr)->sync_with_stdio(false);
  long long n;
  cin >> n;
  string s;
  cin >> s;
  long long m;
  cin >> m;
  nd rt;
  while (m--) {
    string t;
    cin >> t;
    reverse(t.begin(), t.end());
    string u;
    u.resize(t.size());
    transform(t.begin(), t.end(), u.begin(), [](char c) { return tolower(c); });
    reverse(t.begin(), t.end());
    rt.ins(u, t);
  }
  vector<long long> dp(n + 1, -1);
  dp.back() = n;
  for (long long i = n - 1; i >= 0; i--) {
    nd *ptr = &rt;
    for (long long j = 0; i + j < n && dp[i] == -1; j++) {
      if (ptr->mp.count(s[i + j])) {
        ptr = ptr->mp[s[i + j]];
        if (!ptr->str.empty() && dp[i + j + 1] != -1) dp[i] = i + j + 1;
      } else
        break;
    }
  }
  long long cur = 0;
  while (cur != n) {
    long long nxt = dp[cur];
    nd *ptr = &rt;
    for (long long i = cur; i < nxt; i++) ptr = ptr->mp[s[i]];
    cout << ptr->str << " ";
    cur = nxt;
  }
  cout << "\n";
}
