//土尔逊Torson 在2023/2/4 日 编写
#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>
#include <string>
#include <iostream>

using namespace std;

char sample[7][7] = { 0 };// 题目中说原始样板图大小不超过 5*5,初始化为零
char outlook[3007][3007] = { 0 };// 题目中说最终图样大小不超过 3000*3000
//char tmplook[3000][3000] = { 0 };

//计算最终图样边长大小
int edgeCompute(int size, int times) {
    int edgeNum = size;
    for (int i = 0; i < times - 1; ++i) {
        edgeNum = edgeNum * size;
    }
    return edgeNum;
}

//绘制最终图样的第二层(最终层),采用递归实现。
//根据原始样板图样的形状决定大的轮廓,再在大轮廓的每一个图样位置绘制更小的原始图样轮廓。
void paint(int size, int duplic, int x, int y) {
    //int x = 0, y = 0;
    //最小层绘制原始图
    if (duplic == 1) {
        for (int i = 0; i < size; ++i) {
            for (int j = 0; j < size; ++j) {
                outlook[x + i][y + j] = sample[i][j];
            }
        }
    } else { //如果不是最小单元原始样板图,则继续递归的使用自己这个函数
        int paint_edge = edgeCompute(size,
                                     duplic - 1);//计算每小一层的图样边长大小
        for (int i = 0; i < size; ++i) {
            for (int j = 0; j < size; ++j) {
                if (sample[i][j] != ' ') {
                    paint(size, duplic - 1, x + i * paint_edge,
                          y + j * paint_edge); //递归自己这个函数
                }
            }
        }
    }
}

int main() {
    int size; //原始样板图大小
    int duplic; //复制放大倍数
    while (scanf("%d", &size)) {
        if (size == 0) { // 如果为零,则程序结束
            break;
        }
        getchar();//吃掉回车

        //每次读取数据都把最终图样二维数组初始化为 0
        for (int i = 0; i < 3007; i++) {
            for (int j = 0; j < 3007; j++) {
                outlook[i][j] = { 0 };
            }
        }

        // 读取原始样板图
        for (int i = 0; i < size; ++i) {
            for (int j = 0; j < size; ++j) {
                sample[i][j] = getchar();
            }
            getchar();
        }
        scanf("%d", &duplic);
        //数据读取结束

        //开始分层绘制最终图样
        //计算最终图样边长大小
        int edge = edgeCompute(size, duplic);

        //初始化最终图样的(第一层)底层图为空格 ' '
        for (int i = 0; i < edge; ++i) {
            for (int j = 0; j < edge; ++j) {
                outlook[i][j] = ' ';
            }
        }

        //在最终图样的全部是空格 ' ' 的图的基础上从细节处一个个递归的绘制最终图
        paint(size, duplic, 0, 0);
        for (int i = 0; i < edge; ++i) {
            printf("%s\n", outlook[i]);
        }
        //printf("%d, %d", duplic, edge);//调试函数是否正确
    }
    return 0;
}