#include <bits/stdc++.h>
using namespace std;
const double eps = 1e-9;
const int mod = (int)1e+9 + 7;
const double pi = acos(-1.);
const int maxn = 1000100;
int dp[maxn];
string wd[maxn];
map<char, int> bor[maxn];
int id[maxn], sz = 1;
void add(string &s, int q) {
  int cur = 0;
  for (int i = 0; i < (int)s.length(); i++) {
    char c = tolower(s[i]);
    if (!bor[cur].count(c)) {
      bor[cur][c] = sz;
      sz++;
    }
    cur = bor[cur][c];
  }
  id[cur] = q;
}
int main() {
  {
    srand(time(0));
    const string file = "";
    if (!file.empty()) {
      freopen((file + ".in").c_str(), "r", stdin);
      freopen((file + ".out").c_str(), "w", stdout);
    }
  }
  int n;
  scanf("%d\n", &n);
  string s;
  getline(cin, s);
  int m;
  scanf("%d\n", &m);
  for (int i = 1; i <= m; i++) {
    getline(cin, wd[i]);
    add(wd[i], i);
  }
  dp[0] = -1;
  for (int i = 0; i < n; i++) {
    int cur = 0;
    for (int j = 0; j <= i; j++) {
      char c = tolower(s[i - j]);
      if (!bor[cur].count(c)) break;
      cur = bor[cur][c];
      if (id[cur] != 0 && dp[i - j] != 0) {
        dp[i + 1] = id[cur];
      }
    }
  }
  if (dp[n] == 0) assert(0);
  vector<int> vc;
  while (n) {
    vc.push_back(dp[n]);
    n -= wd[dp[n]].length();
  }
  for (int i = (int)vc.size() - 1; i >= 0; i--) {
    printf("%s ", wd[vc[i]].c_str());
  }
  return (0);
}
