#include<iostream>
#include<cstdio>
#include<math.h>
#include<string>
using namespace std;
char templat [6][6]; //初始模版:
char m2[3000][3000];// new template
char result[3000][3000];
int len; // new the size of matrix
int n,q; // input n and q level
void update(int x,int y,bool flag) {
// len 应该是此时(模版)的大小
for (int i = 0;i < len; i++){
for (int j = 0; j < len; j++){
if (flag)
result [x+i][y+j] = m2[i][j]; // 每次更新一个模版大小的图形
else
result [x+i][y+j] = ' ';
}
}
}
int main(){
while(cin >> n){
// input and output is not in same buffer so,every time you can output the result array;
if(n == 0) break;
//2.前面的scanf()在读取输入时会在缓冲区中留下一个字符'\n'(输入完s[i]的值后按回车键所致),
//所以如果不在此加一个getchar()把这个回车符取走的话,gets()就不会等待从键盘键入字符,
//而是会直接取走这个“无用的”回车符,从而导致读取有误;
cin.get(); // take the \n
for(int i=0;i<n;i++){
//读入整行数据,它使用回车键输入的换行符来确定输入结尾。
//调用方法: cin.getline(str (字符数组), len);
// 获取输入方法2:
// string temp;
// getline(cin,temp);
// for (int j = 0; j < temp.size(); j++)
// templat[i][j] = temp[j];
cin.getline(templat[i],6); // 获取输入方法1
}
scanf("%d",&q);
for(int k=0;k<q;k++){
len = pow(n,k);
// first level:
if(len == 1){ // 边界条件 如果是k就是0,如果是len就是1
for (int i = 0; i < n; i++)
for(int j=0;j<n;j++){
m2[i][j] = templat[i][j];
result[i][j] = m2[i][j];
}
}
else{
// 1.分析模版,按照初始模版来替换
for (int i = 0; i < n; i++){
for (int j = 0; j < n; j++){
if (templat[i][j]==' ')
update(i*len,j*len,false);
else
update(i*len,j*len,true);
}
}
// 3. 交换 此时的 模版和结果:
for (int i = 0; i < len*n; i++){
for (int j = 0; j < len*n; j++)
m2[i][j] = result[i][j];
}
}
}
//输出
len = pow(n,q);
for (int i = 0; i < len; i++)
{
for (int j = 0; j < len; j++)
cout << result[i][j];
cout << endl;
}
}
return 0;
}