#include <bits/stdc++.h>
using namespace std;
inline void pisz(int n) { printf("%d\n", n); }
template <typename T, typename TT>
ostream &operator<<(ostream &s, pair<T, TT> t) {
  return s << "(" << t.first << "," << t.second << ")";
}
template <typename T>
ostream &operator<<(ostream &s, vector<T> t) {
  for (int(i) = 0; (i) < (((int)((t).size()))); ++(i)) s << t[i] << " ";
  return s;
}
struct Node {
  map<char, Node *> m;
  int patnum;
  Node() : patnum(-1) {}
  void wstaw(const char *s, int num) {
    if (*s == 0) {
      patnum = num;
      return;
    }
    int c = *s;
    if (!m.count(c)) {
      m[c] = new Node();
    }
    m[c]->wstaw(s + 1, num);
  }
};
const int N = 1001001;
char s[N], buf[N];
string t[N], orig[N];
vector<int> pats[N];
int dp[N];
int main() {
  int(n);
  scanf("%d", &(n));
  scanf("%s", s);
  int(m);
  scanf("%d", &(m));
  for (int(j) = 1; (j) <= (m); ++(j)) {
    scanf("%s", buf);
    orig[j] = t[j] = buf;
    for (char &c : t[j])
      if (isupper(c)) c = c - 'A' + 'a';
    reverse(t[j].begin(), t[j].end());
  }
  Node root;
  for (int(j) = 1; (j) <= (m); ++(j)) root.wstaw(t[j].c_str(), j);
  dp[n] = 0;
  for (int(i) = (n - 1); (i) >= (0); --i) {
    dp[i] = -1;
    Node *x = &root;
    for (int(k) = (i); (k) <= (n - 1); ++k) {
      if (x->m.count(s[k])) {
        x = x->m[s[k]];
        if (x->patnum != -1) {
          if (dp[i + ((int)((t[x->patnum]).size()))] != -1) {
            dp[i] = x->patnum;
            break;
          }
        }
      } else {
        break;
      }
    }
  }
  int i = 0;
  while (i != n) {
    printf("%s ", orig[dp[i]].c_str());
    i += ((int)((t[dp[i]]).size()));
  }
}
