#include<bits/stdc++.h>
using namespace std;
#define maxn 105
int buf[maxn][maxn];
int ans[maxn][maxn];
void get(int ans[][maxn],int n){
//***********************调试了半个小时,一直不对,终于发现是因为
//***********************不能直接用ans[][]参与计算,因为ans[][]的值是不断更新的,所以要用temp[][]暂存
int temp[maxn][maxn];//必须要有
for(int i=1;i<=n;i++){//赋值
for(int j=1;j<=n;j++){
temp[i][j] = ans[i][j];
}
}
//***********************关键,ans[i][j] = ∑temp[i][k]*temp[k][j]
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
int sum = 0;
for(int k=1;k<=n;k++){
sum += temp[i][k]*buf[k][j];
}
ans[i][j] = sum;
}
}
}
int main(){
int T,n,k;
scanf("%d",&T);
while(T--){
scanf("%d %d",&n,&k);//n为矩阵的行列数,k是阶数
for(int i=1;i<=n;i++){//buf[][]赋值
for(int j=1;j<=n;j++){
scanf("%d",&buf[i][j]);
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
ans[i][j] = buf[i][j];
}
}
if(k!=1){
for(int i=1;i<k;i++){
get(ans,n);
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(j==1)//空格判断
printf("%d",ans[i][j]);
else
printf(" %d",ans[i][j]);
}
printf("\n");
}
}
return 0;
}