#include
#include
#include
using namespace std;
const int maxn = 555;
string add_two_numbers(string a, string b) {
if(a.size() < b.size()) {
swap(a, b);
}
int carry = 0;
string res = "";
int i = (int) a.size() - 1, j = (int) b.size() - 1;
while(j >= 0 and i >= 0) {
int digit_a = (int) (a[i] - '0');
int digit_b = (int) (b[j] - '0');
int sum = digit_a + digit_b + carry;
if(sum < 10) {
carry = 0;
}
else {
carry = 1;
sum -= 10;
}
res += (sum + '0');
i--;
j--;
}
while(i >= 0) {
int digit_a = (int) (a[i] - '0');
int sum = digit_a + carry;
if(sum < 10) {
carry = 0;
}
else {
carry = 1;
sum -= 10;
}
res += (sum + '0');
i--;
}
if(carry == 1) {
res += "1";
}
reverse(res.begin(), res.end());
return res;
}
string multiply_two_numbers(string a, string b) {
vector v((int) a.size() + (int) b.size(), 0);
int sz_a = (int) a.size();
int sz_b = (int) b.size();
for(int i = sz_a - 1; i >= 0; i--) {
for(int j = sz_b - 1; j >= 0; j--) {
v[i + j + 1] += (a[i] - '0') * (b[j] - '0');
}
}
for(int i = sz_a + sz_b - 1; i >= 0; i--) {
if(v[i] >= 10) {
v[i - 1] += v[i] / 10;
v[i] %= 10;
}
}
string res = "";
int i = 0;
while(v[i] == 0) {
i++;
}
while(i < sz_a + sz_b) {
res += (v[i] + '0');
i++;
}
return res;
}
string power(string a, int k) {
string res = "1";
while(k--) {
res = multiply_two_numbers(res, a);
}
return res;
}
bool compare(string a, string b) {
if(a.size() < b.size()) {
return true;
}
if(a.size() > b.size()) {
return false;
}
if(a == b) {
return true;
}
if(a < b) {
return true;
}
return false;
}
string to_str(int number) {
string res = "";
while(number) {
int digit = number % 10;
res += (digit + '0');
number /= 10;
}
reverse(res.begin(), res.end());
return res;
}
int n, m, k, x;
string words[maxn];
int main() {
ios_base::sync_with_stdio(false);
cin >> n >> m >> k >> x;
string s;
cin >> s;
string X = to_str(x);
string K = to_str(k);
for(int i = 0; i < m; i++) {
cin >> words[i];
sort(words[i].begin(), words[i].end());
}
vector pows;
pows.push_back("1");
string current_power = "1";
for(int i = 0; i < m; i++) {
current_power = multiply_two_numbers(current_power, K);
pows.push_back(current_power);
}
current_power = pows[(int) pows.size() - 2];
string tmp = "1";
int at = 0;
vector res;
while(compare(add_two_numbers(tmp, current_power), X)) {
tmp = add_two_numbers(tmp, current_power);
at++;
}
res.push_back(words[0][at]);
int idx = (int) pows.size() - 3;
int i = 1;
while(idx >= 0) {
at = 0;
while(compare(add_two_numbers(tmp, pows[idx]), X)) {
tmp = add_two_numbers(tmp, pows[idx]);
at++;
}
res.push_back(words[i][at]);
i++;
idx--;
}
int o = 0;
for(int i = 0; i < n; i++) {
if(s[i] == '#') {
s[i] = res[o++];
}
cout << s[i];
}
return 0;
}