#include <bits/stdc++.h>
const int MAX_S = 12;
int tpos[4][4][2] = {{{0, 0}, {0, 1}, {0, 2}, {2, 1}},
                     {{0, 2}, {1, 0}, {1, 2}, {2, 2}},
                     {{0, 1}, {2, 0}, {2, 1}, {2, 2}},
                     {{0, 0}, {1, 0}, {1, 2}, {2, 0}}};
int w, h, cur, best, rest;
char board[MAX_S][MAX_S], best_board[MAX_S][MAX_S];
inline bool CanPlace(int x, int y, int type) {
  for (int i = 0; i < 4; ++i) {
    int nx = x + tpos[type][i][0], ny = y + tpos[type][i][1];
    if (board[nx][ny] != '.') return false;
  }
  return true;
}
inline void Place(int x, int y, int type, char ch) {
  board[x + 1][y + 1] = ch;
  for (int i = 0; i < 4; ++i) {
    int nx = x + tpos[type][i][0], ny = y + tpos[type][i][1];
    board[nx][ny] = ch;
  }
}
inline void Record() {
  for (int i = 0; i < h; ++i)
    for (int j = 0; j < w; ++j) best_board[i][j] = board[i][j];
}
void DFS(int x, int y) {
  if (y == w) {
    if (x < h) DFS(x + 1, 0);
    return;
  }
  if (cur + rest / 5 <= best) return;
  int org_rest;
  if (w - y >= 3 && h - x >= 3 && board[x + 1][y + 1] == '.') {
    for (int i = 0; i < 4; ++i) {
      if (CanPlace(x, y, i)) {
        Place(x, y, i, 'A' + cur);
        ++cur;
        if (cur > best) {
          Record();
          best = cur;
        }
        org_rest = rest;
        rest -= 5;
        if (board[x][y] == '.') --rest;
        DFS(x, y + 1);
        rest = org_rest;
        --cur;
        Place(x, y, i, '.');
      }
    }
  }
  org_rest = rest;
  if (board[x][y] == '.') --rest;
  DFS(x, y + 1);
  rest = org_rest;
}
int main() {
  scanf("%d%d", &h, &w);
  for (int i = 0; i < h; ++i)
    for (int j = 0; j < w; ++j) board[i][j] = best_board[i][j] = '.';
  cur = 0;
  rest = w * h;
  best = (w / 3) * (h / 3) - 1;
  if (best < 0) best = 0;
  DFS(0, 0);
  printf("%d\n", best);
  for (int i = 0; i < h; ++i) {
    best_board[i][w] = 0;
    printf("%s\n", best_board[i]);
  }
  return 0;
}
