#include <bits/stdc++.h>
using namespace std;
template <class T>
T abs(T x) {
  return x > 0 ? x : -x;
}
int n;
int m;
string s[30];
string ans[30];
string sans[30];
vector<pair<int, int> > v[30];
int get(char c) {
  if (c <= 'B')
    return c - 'A';
  else
    return c - 'a' + 2;
}
char lol(int x) {
  if (x < 2)
    return x + 'A';
  else
    return (x - 2) + 'a';
}
int t;
int was[100];
int getH(int a, int b) {
  if (a > b) swap(a, b);
  return (a - 48) * 7 + b - 48;
}
int check() {
  t++;
  for (int i = 0; i < (28); i++) {
    int o = getH(ans[v[i][0].first][v[i][0].second],
                 ans[v[i][1].first][v[i][1].second]);
    if (was[o] == t) return 0;
    was[o] = t;
  }
  for (int i = 0; i < (n); i++) sans[i] = ans[i];
  return 1;
}
int col[15];
int xx[100], yy[100];
int o[100][100];
int go(int p, int c) {
  if (p == 14) {
    return check();
  }
  int x = xx[p];
  int y = yy[p];
  long long aans = 0;
  for (int cc = 0; cc <= c; cc++) {
    if (col[cc] < 2) {
      col[cc]++;
      ans[x][y] = ans[x + 1][y] = ans[x][y + 1] = ans[x + 1][y + 1] =
          char(cc + 48);
      aans += go(p + 1, min(max(cc + 1, c), 6));
      col[cc]--;
    }
  }
  return aans;
}
int main() {
  cin >> n >> m;
  for (int i = 0; i < (n); i++) {
    cin >> s[i];
    ans[i] = s[i];
  }
  int pp = 0;
  for (int i = 0; i < (n); i++)
    for (int j = 0; j < (m); j++)
      if (s[i][j] != '.') {
        if (!o[i][j]) {
          xx[pp] = i;
          yy[pp] = j;
          o[i][j] = o[i + 1][j] = o[i][j + 1] = o[i + 1][j + 1] = 1;
          pp++;
        }
        v[get(s[i][j])].push_back(make_pair(i, j));
      }
  long long aans = go(0, 0);
  cout << aans * 5040 << endl;
  for (int i = 0; i < (n); i++) cout << sans[i] << endl;
  return 0;
}
