#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
typedef pair<int, int> PII;
const int N = 210, M = 10;
string str;
string s[M];
vector<PII> posVec;
int st[N][M][N];
int p, k, q, len, minLen;
void preprocess() {
for (int i = 0; i < q; ++i) {
int len = s[i].size();
for (int j = 0; j + len <= str.size(); ++j) {
if (str.substr(j, len) == s[i]) {
posVec.emplace_back(j, j + len - 1);
}
}
}
sort(posVec.begin(), posVec.end());
}
int cal(int stPos, int edPos) {
int count = 0;
for (int i = 0; i < posVec.size();) {
if (posVec[i].first < stPos) {
++i;
continue;
}
int j = i;
bool flag = false;
while (j < posVec.size() && posVec[j].first == posVec[i].first) {
if (posVec[j].second <= edPos && !flag) {
++count;
flag = true;
}
++j;
}
i = j;
}
return count;
}
int dfs(int curPos, int segIdx, int segLen) {
auto &t = st[curPos][segIdx][segLen];
if (t != -1) {
return t;
}
if (segIdx == k - 1) {
if (curPos + segLen != len) {
return t = 0;
} else {
return t = cal(curPos, curPos + segLen - 1);
}
}
int cnt = cal(curPos, curPos + segLen - 1);
int res = cnt;
int neStPos = curPos + segLen;
for (int i = 1; neStPos + i + minLen * (k - segIdx - 2) <= len; ++i) {
res = max(res, cnt + dfs(neStPos, segIdx + 1, i));
}
return t = res;
}
int main() {
cin >> p >> k;
while (p --) {
string tmp;
cin >> tmp;
str += tmp;
}
len = str.size();
if (len < k) {
cout << 0 << endl;
return 0;
}
memset(st, -1, sizeof st);
minLen = 0x3f3f3f3f;
cin >> q;
for (int i = 0; i < q; ++i) {
cin >> s[i];
minLen = min(minLen, (int)s[i].size());
}
preprocess();
int res = 0;
for (int i = 1; i + minLen * (k - 1) <= len; ++i) {
res = max(res, dfs(0, 0, i));
}
cout << res << endl;
return 0;
}