#include <bits/stdc++.h>
using namespace std;
int n, m;
int a[10][10], r[10][10];
int cand, best, lft;
const int dx[4][5] = {
    {0, 0, 0, 1, 2}, {0, 1, 1, 1, 2}, {0, 1, 2, 2, 2}, {0, 1, 1, 1, 2}};
const int dy[4][5] = {
    {0, 1, 2, 1, 1}, {2, 0, 1, 2, 2}, {1, 1, 0, 1, 2}, {0, 0, 1, 2, 0}};
bool Check(int x, int r, int c) {
  if (r < 0 || c < 0 || r + 2 >= n || c + 2 >= m) return false;
  for (int i = 0; i < 5; i++)
    if (a[r + dx[x][i]][c + dy[x][i]] != '.') return false;
  for (int i = 0; i < 5; i++) a[r + dx[x][i]][c + dy[x][i]] = 'A' + cand;
  cand++, lft -= 5;
  return true;
}
void Undo(int x, int r, int c) {
  for (int i = 0; i < 5; i++) a[r + dx[x][i]][c + dy[x][i]] = '.';
  cand--, lft += 5;
}
void Search(int x, int y) {
  if (cand + lft / 5 <= best) return;
  if (x > n) {
    if (cand > best) {
      best = cand;
      for (int i = 0; i < n; i++)
        for (int j = 0; j < m; j++) r[i][j] = a[i][j];
    }
  } else {
    int nxtx = x + (y + 1) / m, nxty = (y + 1) % m;
    if (a[x][y] == '.') lft--;
    Search(nxtx, nxty);
    if (a[x][y] == '.') lft++;
    for (int i = 0; i < 4; i++) {
      if (Check(i, x, y)) {
        if ((i == 1 || i == 2) && a[x][y] == '.') lft--;
        Search(nxtx, nxty);
        if ((i == 1 || i == 2) && a[x][y] == '.') lft++;
        Undo(i, x, y);
      }
    }
  }
}
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 0; i < n; i++)
    for (int j = 0; j < m; j++) r[i][j] = a[i][j] = '.';
  lft = n * m;
  cand = best = 0;
  Search(0, 0);
  printf("%d\n", best);
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) printf("%c", r[i][j]);
    printf("\n");
  }
  return 0;
}
