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

using namespace std;


int n, m;
vector<vector<char>> polje;
vector<vector<bool>> mozetop;
vector<vector<bool>> napadnuto;
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];
	}
}

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

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

void resi() {
	bool napad = true, slobodnamesta = false, fali = 0;
	
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			napad = napadnuto[i][j] && napad;
			slobodnamesta = mozetop[i][j] || slobodnamesta;
			fali += falitop[i][j];
		}
	}
	if (napad && fali==0) {
		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);
	}
	bool postavljanje = false;
	for (int i = 0; i < n; i++) {
		for(int j=0;j<n;j++){
			if (falitop[i][j] != 0 && slobodnegranice(i, j) == falitop[i][j]) {
				if (i != 0) {
					if (mozetop[i - 1][j]) {
						postavljenjetopa(i - 1, j);
					}
				}
				if (i != n -1) {
					if (mozetop[i + 1][j]) {
						postavljenjetopa(i + 1, j);
					}
				}
				if (j != 0) {
					if (mozetop[i][j]) {
						postavljenjetopa(i, j - 1);
					}
				}
				if (j != m -1) {
					if (mozetop[i][j]) {
						postavljenjetopa(i, j + 1);
					}
				}
				postavljanje = true;
			}
		}
	}
	if (postavljanje) {
		resi();
	}
	else {
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < m; j++) {
				if (mozetop[i][j]) {
					postavljenjetopa(i,j);
				}
			}
		}
	}
	resi();
}


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);
	}
	napadnuto.resize(n);
	for (int i = 0; i < n; i++) {
		napadnuto[i].resize(m);
		fill(napadnuto[i].begin(), napadnuto[i].end(), false);
	}
	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;
				napadnuto[i][j] = true;
			}
		}
	}

	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';
			}
		}
	}
	resi();
}