#include <stdio.h>
#include <string.h>
#define fin "seif.in"
#define fout "seif.out"
#define DxBG
const int Nmax = 1011;
int T,K,N,M;
int dp[Nmax][Nmax];
char txt1[Nmax],txt2[Nmax];
int len(char s[])
{
int i;
for ( i = 1; s[i] != '\n'; ++i );
return i - 1;
}
int max(int a,int b) { return ( a > b ) ? ( a ) : ( b ); }
void compute_dp(int dp[][Nmax],char a[],char b[],int len_a,int len_b)
{
int i,j;
memset(dp,0,sizeof(dp));
for ( i = len_a; i > 0; --i )
for ( j = len_b; j > 0; --j )
{
if ( a[i] == b[j] )
dp[i][j] = dp[i+1][j+1] + 1;
else
dp[i][j] = dp[i+1][j];
dp[i][j] = max(dp[i][j],dp[i+1][j]);
dp[i][j] = max(dp[i][j],dp[i][j+1]);
}
#ifdef DBG
printf("%i %i\n",len_a,len_b);
for ( i = 1; i <= len_a; ++i )
{
for ( j = 1; j <= len_b; ++j )
printf("%i ",dp[i][j]);
printf("\n");
}
#endif
}
void compute_greedy(int dp[][Nmax],char a[],char b[],int len_a,int len_b,int lim)
{
int i,j,len_max = 0,poz;
char bst[Nmax];
char car_ales;
memset(bst,0,sizeof(bst));
for ( i = 1; i <= len_a; ++i )
for ( j = 1; j <= len_b; ++j )
{
if ( a[i] == b[j] )
bst[ dp[i][j] ] = max(bst[ dp[i][j] ],a[i]);
len_max = max(dp[i][j],len_max);
}
#ifdef DBG
for ( i = 1; i <= len_max; ++i )
printf("%c ",bst[i]);
printf("\n");
#endif
for ( i = lim; i > 0; --i )
{
car_ales = 'A' - 1;
for ( j = len_max; j >= i; --j )
if ( bst[j] > car_ales )
{
car_ales = bst[j];
poz = j;
}
printf("%c",bst[poz]); //car_ales);
bst[poz]='A' - 1;
}
printf("\n");
}
void read_solve()
{
int i;
freopen(fin,"r",stdin);
freopen(fout,"w",stdout);
scanf("%i",&T);
while ( T -- )
{
scanf("%i\n",&K);
fgets(txt1+1,Nmax,stdin);
fgets(txt2+1,Nmax,stdin);
N = len(txt1);
M = len(txt2);
compute_dp(dp,txt1,txt2,N,M);
compute_greedy(dp,txt1,txt2,N,M,K);
}
}
int main()
{
read_solve();
return 0;
}