#include <bits/stdc++.h>
using namespace std;
vector<vector<int> > ocupado(10, vector<int>(10, 0));
int n, m;
int obtencodigo(int i, int j) {
  int pasos = 3 * m - 1;
  int codigo = 0;
  while (i >= 0 and pasos >= 0) {
    pasos--;
    codigo = codigo * 2 + ocupado[i][j];
    j--;
    if (j < 0) {
      j = m - 1;
      i--;
    }
  }
  return codigo;
}
int colocar[4][5][2] = {{{-1, -1}, {-1, 0}, {-1, 1}, {0, 0}, {1, 0}},
                        {{-1, -1}, {0, -1}, {1, -1}, {0, 0}, {0, 1}},
                        {{1, -1}, {1, 0}, {1, 1}, {0, 0}, {-1, 0}},
                        {{-1, 1}, {0, 1}, {1, 1}, {0, 0}, {0, -1}}};
bool coloca(int i, int j, int k) {
  bool bien = true;
  for (int kk = 0; kk < 5; kk++) {
    int ii = i + colocar[k][kk][0];
    int jj = j + colocar[k][kk][1];
    if (ocupado[ii][jj] > 0) bien = false;
    ocupado[ii][jj]++;
  }
  return bien;
}
vector<string> sol;
void coloca(int i, int j, int k, char c) {
  for (int kk = 0; kk < 5; kk++) {
    int ii = i + colocar[k][kk][0];
    int jj = j + colocar[k][kk][1];
    sol[ii][jj] = c;
  }
}
void quita(int i, int j, int k) {
  for (int kk = 0; kk < 5; kk++) {
    int ii = i + colocar[k][kk][0];
    int jj = j + colocar[k][kk][1];
    ocupado[ii][jj]--;
  }
}
vector<map<int, int> > maximo(81);
vector<map<int, int> > eleccion(81);
int computa(int pos) {
  if (pos == (n - 2) * (m - 2)) {
    return 0;
  }
  int i = pos / (m - 2);
  int j = pos % (m - 2);
  i++;
  j++;
  int codigo = obtencodigo(i + 1, j);
  if (maximo[pos].find(codigo) != maximo[pos].end()) return maximo[pos][codigo];
  maximo[pos][codigo] = computa(pos + 1);
  eleccion[pos][codigo] = 0;
  for (int k = 0; k < 4; k++) {
    if (coloca(i, j, k)) {
      int ret = computa(pos + 1);
      if (ret + 1 > maximo[pos][codigo]) {
        maximo[pos][codigo] = ret + 1;
        eleccion[pos][codigo] = k + 1;
      }
    }
    quita(i, j, k);
  }
  return maximo[pos][codigo];
}
int main() {
  cin >> n >> m;
  if (n <= 2 or m <= 2) {
    cout << 0 << endl;
    for (int i = 0; i < n; i++) {
      for (int j = 0; j < m; j++) cout << ".";
      cout << endl;
    }
    exit(0);
  }
  int resultado = computa(0);
  cout << resultado << endl;
  sol = vector<string>(n, string(m, '.'));
  char c = 'A';
  for (int pos = 0; pos < (n - 2) * (m - 2); pos++) {
    int i = pos / (m - 2);
    int j = pos % (m - 2);
    i++;
    j++;
    int codigo = obtencodigo(i + 1, j);
    int ele = eleccion[pos][codigo];
    if (ele != 0) {
      ele--;
      coloca(i, j, ele);
      coloca(i, j, ele, c);
      c++;
    }
  }
  for (int i = 0; i < n; i++) cout << sol[i] << endl;
}
