#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
#include<string>
//本题主要是在考递归的思想
using namespace std;
int n;
vector<string>p;//得有一个最初的模板,才能确定展开的位置

vector<string> dfs(vector<string>tmp, int q) {
    if (q == 1)return p;//此时返回模板
    //要先得到当前层的模板
    vector<string>s = dfs(p, q- 1);
    int m = s.size();//得到当前层模板的大写
    //开辟一个当前层要返回的模板数组
    vector<string>res(n * m);//因为每个位置都按上一层的模板进行了展开
    //先全部放好空个然后再把需要填东西的地方填上
    for (int i = 0; i < res.size(); i++) {
        res[i] = string(n * m, ' ');//每一行都放上空格,这个string初始化的方法学一下
    }
    //然后在该填入模板的地方填入模板
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++) {
            if (p[i][j] != ' ') {
                //说明此时要进行展开,放入模板
                for (int k = 0; k < m; k++)
                    for (int l = 0; l < m; l++) {
                        res[i * m + k][j * m + l] = s[k][l];
                    }
            }

        }

    return res;
}
int main()
{

    while (cin >> n,n) {
        getchar();//使用getline时,如果不是第一行,要先把第一行的回车读取掉
        p.clear();//模板要清空
        string str;
        for (int i = 0; i < n; i++) {
            getline(cin, str);
            p.push_back(str);
        }
        int q;
        cin >> q;//得到输出层数然后开始递归
        vector<string> res = dfs(p, q);
        for (auto item : res) {
            cout << item << endl;
        }


    }
    return 0;
}