#include <bits/stdc++.h>
using namespace std;
const int SIGMA = 26;
const int DIM = 1005;
const int EXP = 2;
char str[EXP][DIM]; int len[EXP];
int nxt[EXP][DIM][SIGMA], dp[DIM][DIM];
int main(void)
{
freopen("seif.in" , "r", stdin );
freopen("seif.out", "w", stdout);
int t;
scanf("%d", &t);
while (t--) {
int k;
scanf("%d", &k);
memset(nxt, 0, sizeof(nxt));
for (int p = 0; p < 2; ++p) {
scanf("%s", str[p]);
len[p] = (int) strlen(str[p]);
for (int j = 0; j < SIGMA; ++j)
nxt[p][len[p]][j] = len[p];
for (int i = len[p] - 1; i >= 0; --i) {
memcpy(nxt[p][i], nxt[p][i + 1], SIGMA << 2);
nxt[p][i][str[p][i] - 'A'] = i;
}
}
memset(dp, 0, sizeof(dp));
for (int i = len[0] - 1; i >= 0; --i) {
for (int j = len[1] - 1; j >= 0; --j) {
if (str[0][i] == str[1][j])
dp[i][j] = 1 + dp[i + 1][j + 1];
else
dp[i][j] = max(dp[i + 1][j], dp[i][j + 1]);
} }
for (int i = -1, j = -1; k != 0; ) {
for (int p = SIGMA - 1; p >= 0; --p) {
if (dp[nxt[0][i + 1][p]][nxt[1][j + 1][p]] < k)
continue;
i = nxt[0][i + 1][p];
j = nxt[1][j + 1][p];
printf("%c", p + 'A');
k -= (dp[i][j] == k);
break;
}
}
printf("\n");
}
return 0;
}