#include <bits/stdc++.h>
using namespace std;
void solve();
int main() {
  int t = 1;
  while (t--) {
    solve();
  }
  return 0;
}
namespace input {
inline int nextInt() {
  int res = 0;
  char c = getchar();
  while (c < '0' || c > '9') c = getchar();
  while (c >= '0' && c <= '9') res = res * 10 + c - '0', c = getchar();
  return res;
}
inline long long nextLong() {
  long long res = 0;
  char c = getchar();
  while (c < '0' || c > '9') c = getchar();
  while (c >= '0' && c <= '9') res = res * 10 + c - '0', c = getchar();
  return res;
}
inline bool isSpace(const char &c) {
  return c == ' ' || c == '\n' || c == '\r' || c == '\t' || c == -1;
}
inline void next(char *str) {
  char c = getchar();
  while (isSpace(c)) c = getchar();
  size_t head = 0;
  while (!isSpace(c)) str[head++] = c, c = getchar();
  str[head] = 0;
}
inline char nextChar() {
  char c = getchar();
  while (isSpace(c)) c = getchar();
  return c;
}
}  // namespace input
using namespace input;
const int N = 1e5 + 5;
char s[N];
string in[N];
char temp[N];
long long h[2][N];
const long long MOD[] = {(long long)1e9 + 9, (long long)1e9 + 7};
long long pw[2][N];
bool dp[N];
int pr[N], sub[N];
void solve() {
  srand(unsigned(time(nullptr)));
  int n = nextInt();
  next(s);
  int m = nextInt();
  for (int i = 0; i < m; i++) {
    next(temp);
    in[i] = temp;
  }
  const int p = 30;
  pw[0][0] = pw[1][0] = 1;
  for (int i = 0; i < n; i++) {
    h[0][i + 1] = (h[0][i] * p + (s[i] - 'a' + 1)) % MOD[0];
    h[1][i + 1] = (h[1][i] * p + (s[i] - 'a' + 1)) % MOD[1];
    pw[0][i + 1] = (pw[0][i] * p) % MOD[0];
    pw[1][i + 1] = (pw[1][i] * p) % MOD[1];
  }
  map<pair<int, int>, int> mp;
  int mxl = 0;
  for (int j = 0; j < m; j++) {
    long long h1 = 0, h2 = 0;
    int len = (int)in[j].size();
    for (int i = 0; i < len; i++) {
      h1 = (h1 * p + ((in[j][len - i - 1] | 32) - 'a' + 1)) % MOD[0];
      h2 = (h2 * p + ((in[j][len - i - 1] | 32) - 'a' + 1)) % MOD[1];
    }
    mp[{h1, h2}] = j;
    mxl = max(mxl, len);
  }
  dp[0] = 1;
  for (int i = 1; i <= n; i++) {
    for (int j = i; j > 0 && i - j <= mxl; j--) {
      long long h1 =
          (h[0][i] - (h[0][j - 1] * pw[0][i - j + 1] % MOD[0]) + MOD[0]) %
          MOD[0];
      long long h2 =
          (h[1][i] - (h[1][j - 1] * pw[1][i - j + 1] % MOD[1]) + MOD[1]) %
          MOD[1];
      auto it = mp.find({h1, h2});
      if (it != mp.end() && dp[j - 1]) {
        dp[i] = true;
        pr[i] = j - 1;
        sub[i] = it->second;
      }
    }
  }
  vector<int> ans;
  int x = n;
  while (x != 0) {
    ans.push_back(sub[x]);
    x = pr[x];
  }
  reverse(ans.begin(), ans.end());
  string out = "";
  out.reserve(20000);
  for (int i : ans) {
    out += in[i];
    out += " ";
  }
  puts(out.c_str());
}
