#include <stdio.h>
#include <iostream>
#include <vector>

using namespace std;

int n, m;
vector<vector<char>> polje;
vector<vector<bool>> mozetop;
vector<vector<int>> falitop;

int slobodnegranice(int x, int y) {
	int ret = 0;
	if (x != 0) {
		ret += mozetop[x - 1][y];
	}
	if (x != n - 1) {
		ret += mozetop[x + 1][y];
	}
	if (y != 0) {
		ret += mozetop[x][y - 1];
	}
	if (y != m - 1) {
		ret += mozetop[x][y + 1];
	}
	return ret;
}

void postavljenjetopa(int y, int x) {
	polje[y][x] = 'C';
	mozetop[y][x] = false;

	if (x < m - 1) {
		for (int i = x + 1; i < m; i++) {
			if (polje[y][i] != '.') {
				mozetop[y][i] = false;
			}
		}
	}
	if (x != 0) {
		for (int i = x - 1; i >= 0; i--) {
			if (polje[y][i] != '.') {
				mozetop[y][i] = false;
			}
		}
	}
	if (y < n - 1) {
		for (int i = y + 1; i < n; i++) {
			if (polje[i][x] != '.') {
				mozetop[i][x] = false;
			}
		}
	}
	if (y != 0) {
		for (int i = y - 1; i >= 0; i--) {
			if (polje[i][x] != '.') {
				mozetop[i][x] = false;
			}
		}
	}
}

int susednitopovi(int x, int y) {
	int ret = 0;
	if (x != 0) {
		if (polje[x - 1][y]) {
			ret++;
		}
	}
	if (x != n - 1) {
		if (polje[x - +1][y]) {
			ret++;
		}
	}
	if (y != 0) {
		if (polje[x][y-1]) {
			ret++;
		}
	}
	if (y != m - 1) {
		if (polje[x][y+1]) {
			ret++;
		}
	}
	return ret;
}


int main() {
	cin >> n >> m;
	polje.resize(n);
	for (int i = 0; i < n; i++) {
		polje[i].resize(m);
	}
	mozetop.resize(n);
	for (int i = 0; i < n; i++) {
		mozetop[i].resize(m);
		fill(polje[i].begin(), polje[i].end(), true);
	}
	falitop.resize(n);
	for (int i = 0; i < n; i++) {
		falitop[i].resize(m);
		fill(falitop[i].begin(), falitop[i].end(), 0);
	}

	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			cin >> polje[i][j];
		}
	}

	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			if (polje[i][j] != '.') {
				mozetop[i][j] = false;
			}
		}
	}
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			if (polje[i][j] == '0') {
				if (i != 0) {
					mozetop[i - 1][j] = false;
				}
				if (i != n - 1) {
					mozetop[i + 1][j] = false;
				}
				if (j != 0) {
					mozetop[i][j - 1] = false;
				}
				if (j != n) {
					mozetop[i][j + 1] = false;
				}
			}
			if (polje[i][j] > '0' && polje[i][j] <= '4') {
				falitop[i][j] = polje[i][j] - '0';
			}
		}
	}
	for (;;) {
		bool slobodnamesta = false, post = false;
		int fali = 0;

		for (int i = 0; i < n; i++) {
			for (int j = 0; j < m; j++) {
				slobodnamesta = mozetop[i][j] || slobodnamesta;
				if (polje[i][j] > '0' && polje[i][j] <= '4') {
					falitop[i][j] = polje[i][j] - '0' - susednitopovi(i, j);
				}
				fali += falitop[i][j];
			}
		}

		if (fali == 0 && !slobodnamesta) {
			for (int i = 0; i < n; i++) {
				for (int j = 0; j < m; j++) {
					cout << polje[i][j];
				}
				cout << "\n";
			}
			exit(0);
		}
		if (fali != 0 && !slobodnamesta) {
			cout << -1;
			exit(0);
		}
		if (fali == 0 && slobodnamesta) {
			for (int i = 0; i < n; i++) {
				for (int j = 0; j < m; j++) {
					if (mozetop[i][j]) {
						postavljenjetopa(i, j);
					}
				}
			}
		}
		if (fali != 0 && slobodnamesta) {
			for (int i = 0; i < n; i++) {
				for (int j = 0; j < m; j++) {
					if (falitop[i][j] == susednitopovi(i, j)) {
						if (i != 0 && mozetop[i-1][j]) {
							postavljenjetopa(i - 1, j);
						}
						if (i != n - 1 && mozetop[i + 1][j]) {
							postavljenjetopa(i + 1, j);
						}
						if (j != 0 && mozetop[i][j-1]) {
							postavljenjetopa(i, j - 1);
						}
						if (j != m - 1 && mozetop[i][j + 1]) {
							postavljenjetopa(i, j + 1);
						}
					}
				}
			}
		}
	}
}