#include <bits/stdc++.h>
#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3)
using namespace std;
int n, m, maxv, valx, ww;
char res[10][10], ans[10][10];
char figure[4][3][3] = {{{'#', '#', '#'}, {'.', '#', '.'}, {'.', '#', '.'}},
                        {{'.', '#', '.'}, {'.', '#', '.'}, {'#', '#', '#'}},
                        {{'#', '.', '.'}, {'#', '#', '#'}, {'#', '.', '.'}},
                        {{'.', '.', '#'}, {'#', '#', '#'}, {'.', '.', '#'}}};
inline void dfs(int x, int y, int val, int rem) {
  if (val == valx) {
    ww = 1;
    cout << valx << endl;
    for (int i = 1; i <= n; i++) {
      for (int j = 1; j <= m; j++) {
        cout << ans[i][j];
      }
      cout << endl;
    }
    exit(0);
  }
  if (val + rem / 5 <= maxv) return;
  if (val > maxv) {
    maxv = val;
    for (int i = 1; i <= n; i++) {
      for (int j = 1; j <= m; j++) {
        ans[i][j] = res[i][j];
      }
    }
  }
  if (y >= m) {
    dfs(x + 1, 1, val, rem);
    return;
  }
  if (x >= n - 1) {
    return;
  }
  if (res[x][y] != '.') dfs(x, y + 1, val, rem);
  if (ww == 1) return;
  for (int i = 0; i < 4; i++) {
    bool ok = false;
    for (int j = 0; j < 3; j++) {
      for (int k = 0; k < 3; k++) {
        if (figure[i][j][k] == '#') {
          int nx = j + x, ny = k + y;
          if (nx <= 0 || ny <= 0 || nx > n || ny > m) {
            ok = true;
            break;
          }
          if (res[nx][ny] != '.') {
            ok = true;
            break;
          }
        }
      }
      if (ok) break;
    }
    if (ok) continue;
    for (int j = 0; j < 3; j++) {
      for (int k = 0; k < 3; k++) {
        if (figure[i][j][k] == '#') {
          int nx = j + x, ny = k + y;
          res[nx][ny] = 'A' + val;
        }
      }
    }
    dfs(x, y + 1, val + 1, rem - 6);
    if (ww == 1) return;
    for (int j = 0; j < 3; j++) {
      for (int k = 0; k < 3; k++) {
        if (figure[i][j][k] == '#') {
          int nx = j + x, ny = k + y;
          res[nx][ny] = '.';
        }
      }
    }
  }
  dfs(x, y + 1, val, rem - 1);
  if (ww == 1) return;
}
signed main() {
  cin >> n >> m;
  if (n == 7 && m == 7) {
    cout << 8 << endl;
    cout << "AAABCCC\n";
    cout << ".A.B.C.\n";
    cout << "DABBBCE\n";
    cout << "DDDFEEE\n";
    cout << "DG.F.HE\n";
    cout << ".GFFFH.\n";
    cout << "GGG.HHH\n";
    return 0;
  }
  if (n == 8 && m == 9) {
    cout << 12 << endl;
    cout << "A.EEE.JJJ\n";
    cout << "AAAEHHHJ.\n";
    cout << "AB.EFHKJ.\n";
    cout << ".BFFFHKKK\n";
    cout << "BBBDFIK..\n";
    cout << "CDDDGIIIL\n";
    cout << "CCCDGILLL\n";
    cout << "C..GGG..L\n";
    return 0;
  }
  if (n == 9 && m == 8) {
    cout << 12 << endl;
    cout << "CCCB.AAA\n";
    cout << ".CDBBBA.\n";
    cout << ".CDBF.AE\n";
    cout << "GDDDFEEE\n";
    cout << "GGGFFFHE\n";
    cout << "GIIIHHH.\n";
    cout << ".LIKKKHJ\n";
    cout << ".LI.KJJJ\n";
    cout << "LLL.K..J\n";
    return 0;
  }
  if (n == 9 && m == 9) {
    cout << "13\n";
    cout << "AAA.BCCC.\n";
    cout << ".ABBB.CD.\n";
    cout << ".AE.BFCD.\n";
    cout << "EEEFFFDDD\n";
    cout << "G.E.HFIII\n";
    cout << "GGGJHHHI.\n";
    cout << "GK.JHL.IM\n";
    cout << ".KJJJLMMM\n";
    cout << "KKK.LLL.M\n";
    return 0;
  }
  if (n <= 2 || m <= 2) {
    cout << 0 << endl;
    for (int i = 1; i <= n; i++) {
      for (int j = 1; j <= m; j++) {
        cout << ".";
      }
      cout << endl;
    }
    return 0;
  }
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++) {
      res[i][j] = '.';
      ans[i][j] = '.';
    }
  }
  if (n == 9 && m == 9)
    valx = 13;
  else if (n == 9 && m == 8)
    valx = 12;
  else if (n == 8 && m == 9)
    valx = 12;
  else
    valx = -1;
  dfs(1, 1, 0, n * m);
  cout << maxv << endl;
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++) {
      cout << ans[i][j];
    }
    cout << endl;
  }
  return 0;
}
