#include <bits/stdc++.h>
using namespace std;
template <typename Arg1>
void __f(const char* name, Arg1&& arg1) {
  cerr << name << ": " << arg1 << endl;
}
template <typename Arg1, typename... Args>
void __f(const char* names, Arg1&& arg1, Args&&... args) {
  const char* comma = strchr(names + 1, ',');
  cerr.write(names, comma - names) << ": " << arg1 << " |";
  __f(comma + 1, args...);
}
const long long maxn = (long long)3e3 + 100;
const long long maxm = (long long)52;
const int logn = 22;
const long long INF = 1e9 + 100;
const long long MOD = 1000000007;
const double PI = acos(-1.0);
const double EPS = 1e-12;
struct Node {
  int nxt[26];
  int from;
  Node() {
    memset((nxt), 0, sizeof(nxt));
    from = -1;
  }
};
vector<Node> data;
void Init() {
  data.resize(0);
  data.push_back(Node());
}
void Insert(const string& s, int offset) {
  int p = 0;
  for (auto ch : s) {
    ch -= 'a';
    if (data[p].nxt[ch] == 0) {
      data.push_back(Node());
      data[p].nxt[ch] = data.size() - 1;
    }
    p = data[p].nxt[ch];
  }
  data[p].from = offset;
}
vector<pair<int, int> > Query(const string& s, int offset) {
  vector<pair<int, int> > ans;
  int p = 0;
  for (int i = offset; i < s.size(); ++i) {
    auto ch = s[i] - 'a';
    if (data[p].nxt[ch] == 0) return ans;
    p = data[p].nxt[ch];
    if (data[p].from != -1) {
      ans.push_back({i, data[p].from});
    }
  }
  return ans;
}
int main(int argc, const char* argv[]) {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  int n;
  while (cin >> n) {
    Init();
    string s;
    cin >> s;
    int m;
    cin >> m;
    vector<string> dic(m);
    for (int i = (0); i < ((m)); ++i) {
      cin >> dic[i];
      auto s = dic[i];
      reverse((s).begin(), (s).end());
      transform(s.begin(), s.end(), s.begin(),
                [](char c) { return ::tolower(c); });
      Insert(s, i);
    }
    vector<int> dp(n + 1, -1);
    vector<int> from(n + 1, -1);
    dp[0] = 0;
    for (int i = 0; i < n; ++i)
      if (dp[i] != -1) {
        int offset = i + 1;
        auto nexts = Query(s, offset - 1);
        for (auto p : nexts) {
          int ind = p.first;
          int f = p.second;
          if (dp[ind + 1] == -1) {
            dp[ind + 1] = 1;
            from[ind + 1] = f;
          }
        }
      }
    vector<int> ans;
    int cur = n;
    while (cur > 0) {
      ans.push_back(from[cur]);
      cur -= dic[from[cur]].size();
    }
    reverse((ans).begin(), (ans).end());
    for (auto i : ans) {
      cout << dic[i] << " ";
    }
    cout << endl;
  }
  return 0;
}
