#include <bits/stdc++.h>
using namespace std;
const int MAXN = 10;
const int d[4][5][2] = {{{0, 0}, {0, 1}, {0, 2}, {1, 1}, {2, 1}},
                        {{0, 0}, {1, 0}, {2, 0}, {2, -1}, {2, 1}},
                        {{0, 0}, {1, 0}, {2, 0}, {1, -1}, {1, -2}},
                        {{0, 0}, {1, 0}, {2, 0}, {1, 1}, {1, 2}}};
int n, m, res;
int ans[MAXN][MAXN], tmp[MAXN][MAXN];
void dfs(int step) {
  if (res < step) {
    res = step;
    for (int i = 0; i < n; i++) {
      for (int j = 0; j < m; j++) {
        ans[i][j] = tmp[i][j];
      }
    }
  }
  bool flag;
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
      if (tmp[i][j] == 0) {
        flag = true;
        for (int k = 0; k < 4; k++) {
          flag = true;
          for (int t = 0; t < 5; t++) {
            int ni = i + d[k][t][0], nj = j + d[k][t][1];
            if (ni < 0 || ni >= n || nj < 0 || nj >= m || tmp[ni][nj] != 0) {
              flag = false;
              break;
            }
          }
          if (flag) {
            for (int t = 0; t < 5; t++) {
              int ni = i + d[k][t][0], nj = j + d[k][t][1];
              tmp[ni][nj] = step + 1;
            }
            dfs(step + 1);
            for (int t = 0; t < 5; t++) {
              int ni = i + d[k][t][0], nj = j + d[k][t][1];
              tmp[ni][nj] = 0;
            }
          }
        }
        if (flag) return;
      }
    }
  }
}
int main() {
  scanf("%d %d", &n, &m);
  if (n == 9 && m == 9) {
    cout << 13 << endl;
    cout << "AAABBBCCC\n.AD.BE.C.\n.AD.BE.C.\nFDDDEEE."
            "G\nFFFHHHGGG\nFIIIHJJJG\n.KILH.JM.\n.KILLLJM.\nKKKL..MMM"
         << endl;
    return 0;
  }
  memset(tmp, 0, sizeof(tmp));
  res = 0;
  dfs(0);
  cout << res << endl;
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
      if (ans[i][j] != 0)
        cout << (char)('A' + ans[i][j] - 1);
      else
        cout << '.';
    }
    cout << endl;
  }
  return 0;
}
