#include<iostream>
#include<vector>
#include<queue>
using namespace std;


int arr[100][100]; // 0: 빈 공간, 1: 미네랄
int bfs_arr[100][100]; // 0: 빈 공간, 1: 확인 X, 2: 바닥에 붙어 있는 미네랄, 3: 공중에 떠 있는 미네랄 


void bfs(int R, int C, int y, int x, int value) {
	int dy[4] = { 0,0,1,-1 };
	int dx[4] = { 1,-1,0,0 };

	queue<pair<int, int>> q;
	q.push(make_pair(y, x));
	bfs_arr[y][x] = value;

	while (!q.empty()) {
		int y = q.front().first;
		int x = q.front().second;
		q.pop();

		for (int i = 0; i < 4; i++) {
			int ny = y + dy[i];
			int nx = x + dx[i];
			if (0 <= ny && ny < R && 0 <= nx && nx < C) {
				if (bfs_arr[ny][nx] == 1) {
					q.push(make_pair(ny, nx));
					bfs_arr[ny][nx] = value;
				}
			}
		}
	}
}

/**
* return 0: 섬 1개, 1: 섬 2개 이상
*/
int world_bfs(int R, int C) {
	int island = 0;

	for (int i = 0; i < R; i++) {
		for (int j = 0; j < C; j++) {
			bfs_arr[i][j] = arr[i][j];
		}
	}

	for (int i = 0; i < C; i++) {
		if (R - 1 >= 0 && bfs_arr[R - 1][i] == 1) {
			bfs(R, C, R - 1, i, 2);
		}
	}
	// 바닥에 붙은 미네랄 처리

	for (int i = 0; i < R; i++) {
		for (int j = 0; j < C; j++) {
			if (bfs_arr[i][j] == 1) {
				bfs(R, C, i, j, 3);
				island = 1;
			}
		}
	}
	// 공중에 떠 있는 미네랄 처리

	return island;
}

/**
* return 0: 내리기 실패, 1: 내리기 성공
*/
int drop(int R, int C) {
	int check_arr[100][100];
	int check = 1;

	for (int i = 0; i < R; i++) {
		for (int j = 0; j < C; j++) {
			check_arr[i][j] = bfs_arr[i][j];
		}
	}

	for (int i = 0; i < C; i++) {
		if (check_arr[R - 1][i] == 3) {
			check = 0;
			return check;
		}
		// case 1: 바닥에 닿는 경우
	}
	for (int i = R - 2; i >= 0; i--) {
		for (int j = 0; j < C; j++) {

			if (check_arr[i][j] == 3 && check_arr[i + 1][j] == 2) {
				check = 0;
				return check;
			}
			// case 2: 클러스터에 닿는 경우
			else if (check_arr[i][j] == 3 && check_arr[i + 1][j] == 0) {
				check_arr[i + 1][j] = check_arr[i][j];
				check_arr[i][j] = 0;
			}
			// case 3: 내려도 되는 경우

		}
	}

	for (int i = 0; i < R; i++) {
		for (int j = 0; j < C; j++) {
			bfs_arr[i][j] = check_arr[i][j];
		}
	}
	return check;
}

void break_mineral(queue<int>& height, int R, int C, int N, int dir) {
	int h = R - height.front();
	height.pop();

	if (dir == 0) {
		for (int i = 0; i < C; i++) {
			if (arr[h][i] == 1) {
				arr[h][i] = 0;
				break;
			}
		}
	}
	else {
		for (int i = C - 1; i >= 0; i--) {
			if (arr[h][i] == 1) {
				arr[h][i] = 0;
				break;
			}
		}
	}
}

void sol(queue<int>& height, int R, int C, int N) {
	int dir = 0; // 0: 왼쪽 1: 오른쪽
	for (int i = 0; i < N; i++) {
		if (!height.empty()) {
			break_mineral(height, R, C, N, dir);
			dir = (dir + 1) % 2;
		}
		// 막대기 투척 코드

		int island = world_bfs(R, C);
		// BFS 코드

		if (island == 1) {
			while (drop(R, C) == 1) {}
		}

		for (int i = 0; i < R; i++) {
			for (int j = 0; j < C; j++) {
				if (bfs_arr[i][j] != 0)
					arr[i][j] = 1;
				else
					arr[i][j] = 0;
			}
		}
		// arr 갱신 코드
	}
}

int main() {
	int R, C;
	int N;
	queue<int> height;

	cin >> R >> C;
	for (int i = 0; i < R; i++) {
		for (int j = 0; j < C; j++) {
			char input;
			cin >> input;
			if (input == '.') {
				arr[i][j] = 0;
			}
			else {
				arr[i][j] = 1;
			}
		}
	}

	cin >> N;
	for (int i = 0; i < N; i++) {
		int input;
		cin >> input;
		height.push(input);
	}

	sol(height, R, C, N);

	for (int i = 0; i < R; i++) {
		for (int j = 0; j < C; j++) {
			if (arr[i][j] == 0)
				cout << '.';
			else
				cout << 'X';
		}
		if (i != R - 1) cout << endl;
	}

	return 0;
}