#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
using namespace std;
//英语 看博友好分析 抄博友程序 dp dfs 没掌握
int cost[100][100];//cost[i][j] 表示第 i 到第 j 个字符分配到某个按键上的代价 抄博友分析
int price[100][100];//price[i][j] 表示前 j 个字符分配在前 i 个按建上的最小代价 抄博友分析
int idx[100][100];
string key;
string letter;
int n,m;
int num[100];
void dfs(int k,int l)
{
if(k==0)
{
return;
}
dfs(k-1,l-idx[k][l]);
cout<<key[k-1]<<": ";
//cout<<l-index[k][l]<<" "<<l<<endl;
for(int i=l-idx[k][l];i<l;i++)
{
cout<<letter[i];
}
cout<<endl;
}
int main()
{
int T;
cin>>T;
int tag=0;
while(T--)
{
tag++;
memset(cost,0,sizeof(cost));
memset(price,0x3f,sizeof(price));
memset(idx,0,sizeof(idx));
cin>>n>>m>>key>>letter;
for(int i=1;i<=m;i++)
{
cin>>num[i];
}
for(int i=1;i<=m;i++)
{
for(int j=i;j<=m;j++)
{
cost[i][j]=cost[i][j-1]+(j-i+1)*num[j];//抄博友程序
}
}
price[0][0]=0;
for(int i=1;i<=n;i++)
{
for(int j=i;j<=m;j++)//背
{
for(int p=1;p<=j-i+1;p++)//背
{
if(price[i][j]>=price[i-1][j-p]+cost[j-p+1][j])//背
{
//cout<<i<<"|"<<j<<"="<<p<<endl;
price[i][j]=price[i-1][j-p]+cost[j-p+1][j];//抄的多
idx[i][j]=p;
}
}
}
}
cout<<"Keypad #"<<tag<<":"<<endl;
dfs(n,m);//背
cout<<endl;
}
return 0;
}