#include "bits/stdc++.h"
#pragma GCC optimize("Ofast,unroll-loops")
#pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")
using namespace std;
using ll = long long int;
mt19937_64 rng(chrono::high_resolution_clock::now().time_since_epoch().count());
struct input_checker {
string buffer;
int pos;
const string all = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
const string number = "0123456789";
const string upper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
const string lower = "abcdefghijklmnopqrstuvwxyz";
input_checker() {
pos = 0;
while (true) {
int c = cin.get();
if (c == -1) {
break;
}
buffer.push_back((char) c);
}
}
int nextDelimiter() {
int now = pos;
while (now < (int) buffer.size() && buffer[now] != ' ' && buffer[now] != '\n') {
now++;
}
return now;
}
string readOne() {
assert(pos < (int) buffer.size());
int nxt = nextDelimiter();
string res;
while (pos < nxt) {
res += buffer[pos];
pos++;
}
// cerr << res << endl;
return res;
}
string readString(int minl, int maxl, const string &pattern = "") {
assert(minl <= maxl);
string res = readOne();
assert(minl <= (int) res.size());
assert((int) res.size() <= maxl);
for (int i = 0; i < (int) res.size(); i++) {
assert(pattern.empty() || pattern.find(res[i]) != string::npos);
}
return res;
}
int readInt(int minv, int maxv) {
assert(minv <= maxv);
int res = stoi(readOne());
assert(minv <= res);
assert(res <= maxv);
return res;
}
long long readLong(long long minv, long long maxv) {
assert(minv <= maxv);
long long res = stoll(readOne());
assert(minv <= res);
assert(res <= maxv);
return res;
}
void readSpace() {
assert((int) buffer.size() > pos);
assert(buffer[pos] == ' ');
pos++;
}
void readEoln() {
assert((int) buffer.size() > pos);
assert(buffer[pos] == '\n');
pos++;
}
void readEof() {
assert((int) buffer.size() == pos);
}
};
int main()
{
ios::sync_with_stdio(false); cin.tie(0);
input_checker inp;
int sumn = 0, minn = 100'001, maxn = 0;
int summ = 0, minm = 100'001, maxm = 0;
int t = inp.readInt(1, 100'000);
inp.readEoln();
while (t--) {
int n = inp.readInt(1, 100'000); inp.readSpace();
int m = inp.readInt(1, 100'000); inp.readEoln();
sumn += n; maxn = max(maxn, n); minn = min(minn, n);
summ += m; maxm = max(maxm, m); minm = min(minm, m);
string text = inp.readString(n, n); inp.readEoln();
string pat = inp.readString(m, m); inp.readEoln();
int ptr = 0;
for (auto &c : text) {
if (ptr < m and pat[ptr] == c) ++ptr;
if (ptr == m) break;
if (c != '?') continue;
for (int i = 0; i < 5; ++i) {
if (pat[ptr] == 'a'+i) continue;
c = 'a' + i;
break;
}
}
if (ptr == m) cout << "-1\n";
else cout << text << '\n';
}
inp.readEof();
assert(sumn <= 300'000);
assert(summ <= 300'000);
cerr << "Sum N, M: " << sumn << ' ' << summ << '\n';
cerr << "Maximum N, M: " << maxn << ' ' << maxm << '\n';
cerr << "Minimum N, M: " << minn << ' ' << minm << '\n';
}