#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<ctype.h>
#define SIZE 20
struct node
{
int row;//行 //编完发现没用上。。。
int col;//列 //编完发现没用上。。。
int val;//值
}p1[SIZE][SIZE],p2[SIZE][SIZE];
void Exchange(node p1[SIZE][SIZE],node p2[SIZE][SIZE],int m,int n,int u,int v,int x,int y)
{ // 被替换矩阵p1 替换矩阵p2 p1的行 列;p2的行 列;替换位置行 列
int i,j,p,q;//i,j用于表示p1的行列坐标;p,q用于表示p2的行列坐标
if(x<=m&&y<=n)
{
for(i=x-1,p=0 ; i<x-1+u&&p<u ; i++,p++)//i=2 i<4 i++
{
for(j=y-1,q=0 ; j<y-1+v&&q<v ; j++,q++)
{
p1[i][j].val=p2[p][q].val;//将替换部分从替换位置开始替换
}
}
}
// printf("Exchange have done!\n");
}
void Print(node p1[SIZE][SIZE],int m,int n)
{
int i,j;
for(i=0 ; i<m ; i++)
{
for(j=0 ; j<n ; j++)
{
printf("%d ",p1[i][j].val); //输出
}
printf("\n");
}
}
int main()
{
int i,j;//循环用
int m,n;//p1的行 列数
// int matrix[][];
while(scanf("%d%d",&m,&n)!=EOF)//输入
{
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
scanf("%d",&p1[i][j].val);//输入p1
p1[i][j].row=i+1; //没有什么卵用。。。
p1[i][j].col=j+1; //没有什么卵用。。。
}
}
int u,v;//p2的行 列数
scanf("%d%d",&u,&v);
for(i=0;i<u;i++)
{
for(j=0;j<v;j++)
{
scanf("%d",&p2[i][j].val);//输入p2
p2[i][j].row=i+1;
p2[i][j].col=j+1;
}
}
int x,y;//替换位置
scanf("%d%d",&x,&y);
Exchange(p1,p2,m,n,u,v,x,y);
Print(p1,m,n);
}
return 0;
}