#include <bits/stdc++.h>
using namespace std;
const int MAXM = 11;
int n, m, tot;
char res[MAXM][MAXM];
void dfs(int x, int y, int move, char st[MAXM][MAXM]) {
  char c[MAXM][MAXM], k;
  int i, j, sum = 0;
  bool z;
  while (x < n && y < m) {
    if (st[x][y] == '.') {
      z = false;
      if (x + 2 < n && y + 2 < m && st[x][y + 1] == '.' &&
          st[x][y + 2] == '.' && st[x + 1][y + 1] == '.' &&
          st[x + 2][y + 1] == '.') {
        for (i = 0; i < n; i++)
          for (j = 0; j < m; j++) c[i][j] = st[i][j];
        k = 'A' + move;
        c[x][y] = c[x][y + 1] = c[x][y + 2] = c[x + 1][y + 1] =
            c[x + 2][y + 1] = k;
        dfs(x, y, move + 1, c);
        z = true;
      }
      if (x + 2 < n && y + 2 < m && st[x + 1][y] == '.' &&
          st[x + 2][y] == '.' && st[x + 1][y + 1] == '.' &&
          st[x + 1][y + 2] == '.') {
        for (i = 0; i < n; i++)
          for (j = 0; j < m; j++) c[i][j] = st[i][j];
        k = 'A' + move;
        c[x][y] = c[x + 1][y] = c[x + 2][y] = c[x + 1][y + 1] =
            c[x + 1][y + 2] = k;
        dfs(x, y, move + 1, c);
        z = true;
      }
      if (x + 2 < n && y + 1 < m && y >= 1 && st[x + 1][y] == '.' &&
          st[x + 2][y] == '.' && st[x + 2][y - 1] == '.' &&
          st[x + 2][y + 1] == '.') {
        for (i = 0; i < n; i++)
          for (j = 0; j < m; j++) c[i][j] = st[i][j];
        k = 'A' + move;
        c[x][y] = c[x + 1][y] = c[x + 2][y] = c[x + 2][y - 1] =
            c[x + 2][y + 1] = k;
        dfs(x, y, move + 1, c);
        z = true;
      }
      if (x + 2 < n && y >= 2 && st[x + 1][y] == '.' && st[x + 2][y] == '.' &&
          st[x + 1][y - 2] == '.' && st[x + 1][y - 1] == '.') {
        for (i = 0; i < n; i++)
          for (j = 0; j < m; j++) c[i][j] = st[i][j];
        k = 'A' + move;
        c[x][y] = c[x + 1][y] = c[x + 2][y] = c[x + 1][y - 1] =
            c[x + 1][y - 2] = k;
        dfs(x, y, move + 1, c);
        z = true;
      }
      if (z) sum++;
      if (sum == 2) break;
    }
    y++;
    if (y == m) {
      x++;
      y = 0;
    }
  }
  if (move > tot) {
    tot = move;
    for (i = 0; i < n; i++)
      for (j = 0; j < m; j++) res[i][j] = st[i][j];
  }
}
void Output_Ans() {
  printf("%d\n", tot);
  int i, j;
  for (i = 0; i < n; i++) {
    for (j = 0; j < m; j++) printf("%c", res[i][j]);
    puts("");
  }
}
int main() {
  while (scanf("%d%d", &n, &m) != EOF) {
    tot = 0;
    char g[MAXM][MAXM];
    memset(res, '.', sizeof(res));
    memset(g, '.', sizeof(g));
    dfs(0, 0, 0, g);
    Output_Ans();
  }
  return 0;
}
