#include<iostream>

#include<algorithm>
#include<vector>
#include<queue>
#include<stack>
#include<list>
#include<map>
#include<set>

#include<stdio.h>
#include<math.h>
#include<ctype.h>
#include<string.h>

using namespace std;

#define FOR(i,a,b) for(int i=a;i<=b;i++)
#define FORD(i,a,b) for(int i=a;i>=b;i--)
#define PB push_back
#define PII pair<int, int>
#define fi first
#define se second
#define MP make_pair

#define SIZE(s) ((int)(s).size())

int X, Y;

#define MAX 1047
char G[2][MAX][MAX], FG[MAX][MAX];
char elm_point;

void read(int k)
{
	FOR(i,0,Y-1)
	{
		FOR(j,0,X-1)
			scanf("%c", &G[k][i][j]);
		scanf("\n");
	}
}

void print(int k)
{
	FOR(i,0,Y-1)
	{
		FOR(j,0,X-1) {
			if (k > -1) printf("%c", G[k][i][j]);
			else printf("%c", FG[i][j]);
		}
		printf("\n");
	}
}

void prepare_final(int k)
{
	FOR(i,0,Y-1)
		FOR(j,0,X-1)
		if (G[k][i][j] != elm_point) FG[i][j] = G[k][i][j];
}

PII first_top(int k)
{
	FOR(i,0,Y-1)
		FOR(j,0,X-1)
		if (G[k][i][j] == elm_point) return MP(i,j);
	return MP(-1,-1);
}

void solve()
{
	//preapre final map
	//FOR(i,0,Y-1) FOR(j,0,X-1) FG[i][j] = '.';
	prepare_final(0);
	prepare_final(1);
	//generate element array

	//top, left, right, bottom
	PII top1 = first_top(0);
	PII top2 = first_top(1);

	PII best;
	best.fi = top2.fi - top1.fi;
	best.se = top2.se - top1.se;
	//transform(0);
	//transform(1);
	
//	printf("%d %d\n", best.fi, best.se);

	FOR(i,0,Y-1)
		FOR(j,0,X-1)
		{
			if (G[1][i][j] == elm_point)
			{
				int ny = i + best.fi;
				int nx = j + best.se;

				if (ny < Y && nx < X && ny >= 0 && nx >= 0)
					FG[ny][nx] = elm_point;
			}
		}
}


int main()
{
	while(true)
	{
		scanf("%d %d '%c'\n", &Y, &X, &elm_point);
		if (X == 0 && Y == 0) return 0;
		read(0);
		scanf("\n");
		read(1);
		scanf("\n");
		//
		//
		//
		solve();

		//print(0);
		//print(1);
		print(-1);
		printf("\n");

	}
	return 0;
}