include[HTML_REMOVED]
using namespace std;
int Q[10010][25],K[10010][25],V[10010][25];
int Q_K_T[10010][10010];
int ans[10010][25];
int n;
int main(){
// 两个正整数 n和 d,表示矩阵的大小
int d;
cin>>n>>d;
int W[n+1];
for(int i=0;i<n;i++)
for(int j=0;j<d;j++)
cin>>Q[i][j];
for(int i=0;i<n;i++)
for(int j=0;j<d;j++)
cin>>K[i][j];
for(int i=0;i<n;i++)
for(int j=0;j<d;j++)
cin>>V[i][j];
for(int i=0;i<n;i++)
cin>>W[i];
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
for(int k=0;k<d;k++){
Q_K_T[i][j]+=Q[i][k]*K[j][k];
}
}
}
// cout<<”-----转置相乘结果是-----“<<endl;
// for(int i=0;i<n;i){
// for(int j=0;j<n;j){
// cout<<Q_K_T[i][j]<<” “;
// }
// cout<<endl;
// }
// cout<<endl;
// 点乘即对应位相乘,记 W(i)为向量 W的第 i个元素,即将 (Q×KT)第 i行中的每个元素都与 W(i)相乘。
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
Q_K_T[i][j]=Q_K_T[i][j]*W[i];
}
}
// cout<<”-----W的点乘结果是-----“<<endl;
// for(int i=0;i<n;i){
// for(int j=0;j<n;j){
// cout<<Q_K_T[i][j]<<” “;
// }
// cout<<endl;
// }
// cout<<endl;
//
for(int i=0;i<n;i++){
for(int j=0;j<d;j++){
//Q的第i行相位乘K的第j行
for(int k=0;k<n;k++){
ans[i][j]+= Q_K_T[i][k]*V[k][j];
}
}
}
// cout<<”-----最终答案-----“<<endl;
for(int i=0;i<n;i){
for(int j=0;j<d;j){
cout<<ans[i][j]<<” “;
}
cout<<endl;
}
return 0;
}