#include <iostream>
#include <vector>

struct Cord { int x, y; };

int N, M;
bool kraj = false;
int sX[] = { 1,0,-1,0 };
int sY[] = { 0,1,0,-1 };

void rokada(std::vector<std::vector<char>> &mat, std::vector<std::vector<bool>> &bmat, std::vector<Cord> &koc, int k);
void proveri(std::vector<std::vector<char>> &mat, std::vector<std::vector<bool>> &bmat, int y, int x);
void proverim(std::vector<std::vector<char>> &mat);
bool sudar(std::vector<std::vector<char>> &mat, int y, int x);

int main()
{
	std::cin >> N >> M;
	std::vector<std::vector<char>> mat(N + 2, std::vector<char>(M + 2, '#'));
	std::vector<Cord> kockice;
	for (int i = 1; i <= N; i++)
		for (int j = 1; j <= M; j++)
		{
			std::cin >> mat[i][j];
			if (mat[i][j] >= '0' && mat[i][j] <= '4')
			{
				kockice.resize(kockice.size() + 1);
				kockice[kockice.size() - 1].x = j;
				kockice[kockice.size() - 1].y = i;
			}
		}
	std::vector<std::vector<bool>> bmat(N + 2, std::vector<bool>(M + 2, true));
	rokada(mat, bmat, kockice, 0);
	if (kraj)
	{
		for (int i = 1; i <= N; i++)
		{
			for (int j = 1; j <= M; j++) std::cout << mat[i][j];
			std::cout << std::endl;
		}
	}
	else std::cout << "-1\n";
	return 0;
}

void rokada(std::vector<std::vector<char>> &mat, std::vector<std::vector<bool>> &bmat, std::vector<Cord> &koc, int k)
{
	if (k == koc.size())
	{
		proveri(mat, bmat, 1, 1);
		return;
	}
	int topovi = 0;
	for (int i = 0; i < 4; i++) if (mat[koc[k].y + sY[i]][koc[k].x + sX[i]] == 'C') topovi++;
	if (mat[koc[k].y][koc[k].x] == '0')
	{
		if (topovi > 0) return;
		bool z[4];
		for (int i = 0; i < 4; i++)
		{
			z[i] = bmat[koc[k].y + sY[i]][koc[k].x + sX[i]];
			bmat[koc[k].y + sY[i]][koc[k].x + sX[i]] = false;
		}
		rokada(mat, bmat, koc, k + 1);
		if (kraj) return;
		for (int i = 0; i < 4; i++) bmat[koc[k].y + sY[i]][koc[k].x + sX[i]] = z[i];
	}
	else if (mat[koc[k].y][koc[k].x] == '1')
	{
		if (topovi > 1) return;
		if (topovi == 1)
		{
			bool z[4];
			for (int i = 0; i < 4; i++)
			{
				z[i] = bmat[koc[k].y + sY[i]][koc[k].x + sX[i]];
				bmat[koc[k].y + sY[i]][koc[k].x + sX[i]] = false;
			}
			rokada(mat, bmat, koc, k + 1);
			if (kraj) return;
			for (int i = 0; i < 4; i++) bmat[koc[k].y + sY[i]][koc[k].x + sX[i]] = z[i];
		}
		else
		{
			bool z[4];
			for (int i = 0; i < 4; i++) z[i] = bmat[koc[k].y + sY[i]][koc[k].x + sX[i]];
			for (int i = 0; i < 4; i++)
				if (mat[koc[k].y + sY[i]][koc[k].x + sX[i]] == '.' && bmat[koc[k].y + sY[i]][koc[k].x + sX[i]] && !sudar(mat, koc[k].y+sY[i], koc[k].x+sX[i]))
				{
					for (int a = 0; a < 4; a++) bmat[koc[k].y + sY[a]][koc[k].x + sX[a]] = false;
					mat[koc[k].y + sY[i]][koc[k].x + sX[i]] = 'C';
					rokada(mat, bmat, koc, k + 1);
					if (kraj) return;
					mat[koc[k].y + sY[i]][koc[k].x + sX[i]] = '.';
					for (int a = 0; a < 4; a++) bmat[koc[k].y + sY[a]][koc[k].x + sX[a]] = z[a];
				}
		}
	}
	else if (mat[koc[k].y][koc[k].x] == '2')
	{
		if (topovi > 2) return;
		if (topovi == 2)
		{
			bool z[4];
			for (int i = 0; i < 4; i++)
			{
				z[i] = bmat[koc[k].y + sY[i]][koc[k].x + sX[i]];
				bmat[koc[k].y + sY[i]][koc[k].x + sX[i]] = false;
			}
			rokada(mat, bmat, koc, k + 1);
			if (kraj) return;
			for (int i = 0; i < 4; i++) bmat[koc[k].y + sY[i]][koc[k].x + sX[i]] = z[i];
		}
		if (topovi == 1)
		{
			bool z[4];
			for (int i = 0; i < 4; i++) z[i] = bmat[koc[k].y + sY[i]][koc[k].x + sX[i]];
			for (int i = 0; i < 4; i++)
				if (mat[koc[k].y + sY[i]][koc[k].x + sX[i]] == '.' && bmat[koc[k].y + sY[i]][koc[k].x + sX[i]] && !sudar(mat, koc[k].y + sY[i], koc[k].x + sX[i]))
				{
					for (int a = 0; a < 4; a++) bmat[koc[k].y + sY[a]][koc[k].x + sX[a]] = false;
					mat[koc[k].y + sY[i]][koc[k].x + sX[i]] = 'C';
					rokada(mat, bmat, koc, k + 1);
					if (kraj) return;
					mat[koc[k].y + sY[i]][koc[k].x + sX[i]] = '.';
					for (int a = 0; a < 4; a++) bmat[koc[k].y + sY[a]][koc[k].x + sX[a]] = z[a];
				}
		}
		else
		{
			bool z[4];
			for (int i = 0; i < 4; i++) z[i] = bmat[koc[k].y + sY[i]][koc[k].x + sX[i]];
			for (int i = 0; i < 4; i++)
				if (mat[koc[k].y + sY[i]][koc[k].x + sX[i]] == '.' && bmat[koc[k].y + sY[i]][koc[k].x + sX[i]] && !sudar(mat, koc[k].y + sY[i], koc[k].x + sX[i]))
				{
					mat[koc[k].y + sY[i]][koc[k].x + sX[i]] = 'C';
					for (int j = 0; j < 4; j++)
					{
						if (j == i) continue;
						if (mat[koc[k].y + sY[j]][koc[k].x + sX[j]] == '.' && bmat[koc[k].y + sY[j]][koc[k].x + sX[j]] && !sudar(mat, koc[k].y + sY[j], koc[k].x + sX[j]))
						{
							for (int a = 0; a < 4; a++) bmat[koc[k].y + sY[a]][koc[k].x + sX[a]] = false;
							mat[koc[k].y + sY[j]][koc[k].x + sX[j]] = 'C';
							rokada(mat, bmat, koc, k + 1);
							if (kraj) return;
							mat[koc[k].y + sY[j]][koc[k].x + sX[j]] = '.';
							for (int a = 0; a < 4; a++) bmat[koc[k].y + sY[a]][koc[k].x + sX[a]] = z[a];
						}
					}
					mat[koc[k].y + sY[i]][koc[k].x + sX[i]] = '.';
				}
		}
	}
	else if (mat[koc[k].y][koc[k].x] == '3')
	{
		if (topovi > 3) return;
		if (topovi == 3)
		{
			bool z[4];
			for (int i = 0; i < 4; i++)
			{
				z[i] = bmat[koc[k].y + sY[i]][koc[k].x + sX[i]];
				bmat[koc[k].y + sY[i]][koc[k].x + sX[i]] = false;
			}
			rokada(mat, bmat, koc, k + 1);
			if (kraj) return;
			for (int i = 0; i < 4; i++) bmat[koc[k].y + sY[i]][koc[k].x + sX[i]] = z[i];
		}
		else if (topovi == 2)
		{
			bool z[4];
			for (int i = 0; i < 4; i++) z[i] = bmat[koc[k].y + sY[i]][koc[k].x + sX[i]];
			for (int i = 0; i < 4; i++)
				if (mat[koc[k].y + sY[i]][koc[k].x + sX[i]] == '.' && bmat[koc[k].y + sY[i]][koc[k].x + sX[i]] && !sudar(mat, koc[k].y + sY[i], koc[k].x + sX[i]))
				{
					for (int a = 0; a < 4; a++) bmat[koc[k].y + sY[a]][koc[k].x + sX[a]] = false;
					mat[koc[k].y + sY[i]][koc[k].x + sX[i]] = 'C';
					rokada(mat, bmat, koc, k + 1);
					if (kraj) return;
					mat[koc[k].y + sY[i]][koc[k].x + sX[i]] = '.';
					for (int a = 0; a < 4; a++) bmat[koc[k].y + sY[a]][koc[k].x + sX[a]] = z[a];
				}
		}
		else if (topovi == 1)
		{
			bool z[4];
			for (int i = 0; i < 4; i++) z[i] = bmat[koc[k].y + sY[i]][koc[k].x + sX[i]];
			for (int i = 0; i < 4; i++)
				if (mat[koc[k].y + sY[i]][koc[k].x + sX[i]] == '.' && bmat[koc[k].y + sY[i]][koc[k].x + sX[i]] && !sudar(mat, koc[k].y + sY[i], koc[k].x + sX[i]))
				{
					mat[koc[k].y + sY[i]][koc[k].x + sX[i]] = 'C';
					for (int j = 0; j < 4; j++)
					{
						if (j == i) continue;
						if (mat[koc[k].y + sY[j]][koc[k].x + sX[j]] == '.' && bmat[koc[k].y + sY[j]][koc[k].x + sX[j]] && !sudar(mat, koc[k].y + sY[j], koc[k].x + sX[j]))
						{
							for (int a = 0; a < 4; a++) bmat[koc[k].y + sY[a]][koc[k].x + sX[a]] = false;
							mat[koc[k].y + sY[j]][koc[k].x + sX[j]] = 'C';
							rokada(mat, bmat, koc, k + 1);
							if (kraj) return;
							mat[koc[k].y + sY[j]][koc[k].x + sX[j]] = '.';
							for (int a = 0; a < 4; a++) bmat[koc[k].y + sY[a]][koc[k].x + sX[a]] = z[a];
						}
					}
					mat[koc[k].y + sY[i]][koc[k].x + sX[i]] = '.';
				}
		}
		else
		{
			bool z[4];
			for (int i = 0; i < 4; i++) z[i] = bmat[koc[k].y + sY[i]][koc[k].x + sX[i]];
			for (int i = 0; i < 4; i++)
				if (mat[koc[k].y + sY[i]][koc[k].x + sX[i]] == '.' && bmat[koc[k].y + sY[i]][koc[k].x + sX[i]] && !sudar(mat, koc[k].y + sY[i], koc[k].x + sX[i]))
				{
					mat[koc[k].y + sY[i]][koc[k].x + sX[i]] = 'C';
					for (int j = 0; j < 4; j++)
					{
						if (j == i) continue;
						if (mat[koc[k].y + sY[j]][koc[k].x + sX[j]] == '.' && bmat[koc[k].y + sY[j]][koc[k].x + sX[j]] && !sudar(mat, koc[k].y + sY[j], koc[k].x + sX[j]))
						{
							mat[koc[k].y + sY[j]][koc[k].x + sX[j]] = 'C';
							for (int l = 0; l < 4; l++)
							{
								if (l == i || l == j) continue;
								if (mat[koc[k].y + sY[l]][koc[k].x + sX[l]] == '.' && bmat[koc[k].y + sY[l]][koc[k].x + sX[l]] && !sudar(mat, koc[k].y + sY[l], koc[k].x + sX[l]))
								{
									for (int a = 0; a < 4; a++) bmat[koc[k].y + sY[a]][koc[k].x + sX[a]] = false;
									mat[koc[k].y + sY[l]][koc[k].x + sX[l]] = 'C';
									rokada(mat, bmat, koc, k + 1);
									if (kraj) return;
									mat[koc[k].y + sY[l]][koc[k].x + sX[l]] = '.';
									for (int a = 0; a < 4; a++) bmat[koc[k].y + sY[a]][koc[k].x + sX[a]] = z[a];
								}
							}
							mat[koc[k].y + sY[j]][koc[k].x + sX[j]] = 'C';
						}
					}
					mat[koc[k].y + sY[i]][koc[k].x + sX[i]] = '.';
				}
		}
	}
	else
	{
		if (topovi == 4)
		{
			bool z[4];
			for (int i = 0; i < 4; i++)
			{
				z[i] = bmat[koc[k].y + sY[i]][koc[k].x + sX[i]];
				bmat[koc[k].y + sY[i]][koc[k].x + sX[i]] = false;
			}
			rokada(mat, bmat, koc, k + 1);
			if (kraj) return;
			for (int i = 0; i < 4; i++) bmat[koc[k].y + sY[i]][koc[k].x + sX[i]] = z[i];
		}
		else if (topovi == 3)
		{
			bool z[4];
			for (int i = 0; i < 4; i++) z[i] = bmat[koc[k].y + sY[i]][koc[k].x + sX[i]];
			for (int i = 0; i < 4; i++)
				if (mat[koc[k].y + sY[i]][koc[k].x + sX[i]] == '.' && bmat[koc[k].y + sY[i]][koc[k].x + sX[i]] && !sudar(mat, koc[k].y + sY[i], koc[k].x + sX[i]))
				{
					for (int a = 0; a < 4; a++) bmat[koc[k].y + sY[a]][koc[k].x + sX[a]] = false;
					mat[koc[k].y + sY[i]][koc[k].x + sX[i]] = 'C';
					rokada(mat, bmat, koc, k + 1);
					if (kraj) return;
					mat[koc[k].y + sY[i]][koc[k].x + sX[i]] = '.';
					for (int a = 0; a < 4; a++) bmat[koc[k].y + sY[a]][koc[k].x + sX[a]] = z[a];
				}
		}
		else if (topovi == 2)
		{
			bool z[4];
			for (int i = 0; i < 4; i++) z[i] = bmat[koc[k].y + sY[i]][koc[k].x + sX[i]];
			for (int i = 0; i < 4; i++)
				if (mat[koc[k].y + sY[i]][koc[k].x + sX[i]] == '.' && bmat[koc[k].y + sY[i]][koc[k].x + sX[i]] && !sudar(mat, koc[k].y + sY[i], koc[k].x + sX[i]))
				{
					mat[koc[k].y + sY[i]][koc[k].x + sX[i]] = 'C';
					for (int j = 0; j < 4; j++)
					{
						if (j == i) continue;
						if (mat[koc[k].y + sY[j]][koc[k].x + sX[j]] == '.' && bmat[koc[k].y + sY[j]][koc[k].x + sX[j]] && !sudar(mat, koc[k].y + sY[j], koc[k].x + sX[j]))
						{
							for (int a = 0; a < 4; a++) bmat[koc[k].y + sY[a]][koc[k].x + sX[a]] = false;
							mat[koc[k].y + sY[j]][koc[k].x + sX[j]] = 'C';
							rokada(mat, bmat, koc, k + 1);
							if (kraj) return;
							mat[koc[k].y + sY[j]][koc[k].x + sX[j]] = '.';
							for (int a = 0; a < 4; a++) bmat[koc[k].y + sY[a]][koc[k].x + sX[a]] = z[a];
						}
					}
					mat[koc[k].y + sY[i]][koc[k].x + sX[i]] = '.';
				}
		}
		else if (topovi == 1)
		{
			bool z[4];
			for (int i = 0; i < 4; i++) z[i] = bmat[koc[k].y + sY[i]][koc[k].x + sX[i]];
			for (int i = 0; i < 4; i++)
				if (mat[koc[k].y + sY[i]][koc[k].x + sX[i]] == '.' && bmat[koc[k].y + sY[i]][koc[k].x + sX[i]] && !sudar(mat, koc[k].y + sY[i], koc[k].x + sX[i]))
				{
					mat[koc[k].y + sY[i]][koc[k].x + sX[i]] = 'C';
					for (int j = 0; j < 4; j++)
					{
						if (j == i) continue;
						if (mat[koc[k].y + sY[j]][koc[k].x + sX[j]] == '.' && bmat[koc[k].y + sY[j]][koc[k].x + sX[j]] && !sudar(mat, koc[k].y + sY[j], koc[k].x + sX[j]))
						{
							mat[koc[k].y + sY[j]][koc[k].x + sX[j]] = 'C';
							for (int l = 0; l < 4; l++)
							{
								if (l == i || l == j) continue;
								if (mat[koc[k].y + sY[l]][koc[k].x + sX[l]] == '.' && bmat[koc[k].y + sY[l]][koc[k].x + sX[l]] && !sudar(mat, koc[k].y + sY[l], koc[k].x + sX[l]))
								{
									for (int a = 0; a < 4; a++) bmat[koc[k].y + sY[a]][koc[k].x + sX[a]] = false;
									mat[koc[k].y + sY[l]][koc[k].x + sX[l]] = 'C';
									rokada(mat, bmat, koc, k + 1);
									if (kraj) return;
									mat[koc[k].y + sY[l]][koc[k].x + sX[l]] = '.';
									for (int a = 0; a < 4; a++) bmat[koc[k].y + sY[a]][koc[k].x + sX[a]] = z[a];
								}
							}
							mat[koc[k].y + sY[j]][koc[k].x + sX[j]] = '.';
						}
					}
					mat[koc[k].y + sY[i]][koc[k].x + sX[i]] = '.';
				}
		}
		else
		{
			bool z[4];
			for (int i = 0; i < 4; i++) z[i] = bmat[koc[k].y + sY[i]][koc[k].x + sX[i]];
			for (int i = 0; i < 4; i++)
				if (mat[koc[k].y + sY[i]][koc[k].x + sX[i]] == '.' && bmat[koc[k].y + sY[i]][koc[k].x + sX[i]] && !sudar(mat, koc[k].y + sY[i], koc[k].x + sX[i]))
				{
					mat[koc[k].y + sY[i]][koc[k].x + sX[i]] = 'C';
					for (int j = 0; j < 4; j++)
					{
						if (j == i) continue;
						if (mat[koc[k].y + sY[j]][koc[k].x + sX[j]] == '.' && bmat[koc[k].y + sY[j]][koc[k].x + sX[j]] && !sudar(mat, koc[k].y + sY[j], koc[k].x + sX[j]))
						{
							mat[koc[k].y + sY[j]][koc[k].x + sX[j]] = 'C';
							for (int l = 0; l < 4; l++)
							{
								if (l == i || l == j) continue;
								if (mat[koc[k].y + sY[l]][koc[k].x + sX[l]] == '.' && bmat[koc[k].y + sY[l]][koc[k].x + sX[l]] && !sudar(mat, koc[k].y + sY[l], koc[k].x + sX[l]))
								{
									mat[koc[k].y + sY[l]][koc[k].x + sX[l]] = 'C';
									for (int m = 0; m < 4; m++)
									{
										if (m == i || m == j || m == l) continue;
										if (mat[koc[k].y + sY[m]][koc[k].x + sX[m]] == '.' && bmat[koc[k].y + sY[m]][koc[k].x + sX[m]] && !sudar(mat, koc[k].y + sY[m], koc[k].x + sX[m]))
										{
											for (int a = 0; a < 4; a++) bmat[koc[k].y + sY[a]][koc[k].x + sX[a]] = false;
											mat[koc[k].y + sY[m]][koc[k].x + sX[m]] = 'C';
											rokada(mat, bmat, koc, k + 1);
											if (kraj) return;
											mat[koc[k].y + sY[m]][koc[k].x + sX[m]] = '.';
											for (int a = 0; a < 4; a++) bmat[koc[k].y + sY[a]][koc[k].x + sX[a]] = z[a];
										}
									}
									mat[koc[k].y + sY[l]][koc[k].x + sX[l]] = '.';
								}
							}
							mat[koc[k].y + sY[j]][koc[k].x + sX[j]] = '.';
						}
					}
					mat[koc[k].y + sY[i]][koc[k].x + sX[i]] = '.';
				}
		}
	}
}

void proveri(std::vector<std::vector<char>> &mat, std::vector<std::vector<bool>> &bmat, int y, int x)
{
	/*
	for (int i = 1; i <= N; i++)
	{
		for (int j = 1; j <= M; j++) std::cout << mat[i][j];
		std::cout << std::endl;
	}
	std::cout << std::endl;
	//std::system("pause>nul");
	//*/
	proverim(mat);
	if (kraj) return;
	for (int i = y; i <= N; i++)
		for (int j = x; j <= M; j++)
			if (mat[i][j] == '.' && bmat[i][j])
			{
				bool moze = true;
				for (int l = 0; l < 4; l++)
					if (mat[i + sY[l]][j + sX[l]] >= '0' && mat[i + sY[l]][j + sX[l]] <= '4')
					{
						moze = false;
						break;
					}
				if (!moze) return;
				if (sudar(mat, i, j)) continue;
				mat[i][j] = 'C';
				proveri(mat, bmat, i, j + 1);
				if (kraj) return;
				mat[i][j] = '.';
				proveri(mat, bmat, i, j + 1);
				if (kraj) return;
			}
}

void proverim(std::vector<std::vector<char>> &mat)
{
	std::vector<std::vector<bool>> bmat(N + 2, std::vector<bool>(M + 2, false));
	for (int i = 1; i <= N; i++)
		for (int j = 1; j <= M; j++)
			if (mat[i][j] == 'C')
			{
				int ty, tx;
				ty = i + 1;
				while (ty <= N && mat[ty][j] == '.') bmat[ty++][j] = true;
				ty = i - 1;
				while (ty > 0 && mat[ty][j] == '.') bmat[ty--][j] = true;
				tx = j + 1;
				while (tx <= M && mat[i][tx] == '.') bmat[i][tx++] = true;
				tx = j - 1;
				while (tx > 0 && mat[i][tx] == '.') bmat[i][tx--] = true;
			}
	for (int i = 1; i <= N; i++)
		for (int j = 1; j <= M; j++)
			if (mat[i][j] == '.' && !bmat[i][j]) return;
	kraj = true;
}

bool sudar(std::vector<std::vector<char>> &mat, int y, int x)
{
	int ty, tx;
	ty = y;
	while (ty <= N && mat[ty][x] == '.') ty++;
	if (mat[ty][x] == 'C') return true;
	ty = y;
	while (ty > 0 && mat[ty][x] == '.') ty--;
	if (mat[ty][x] == 'C') return true;
	tx = x;
	while (tx <= M && mat[y][tx] == '.') tx++;
	if (mat[y][tx] == 'C') return true;
	tx = x;
	while (tx > 0 && mat[y][tx] == '.') tx--;
	if (mat[y][tx] == 'C') return true;
	return false;
}