#include <bits/stdc++.h>
using namespace std;
int data[10][10];
int ans[10][10];
int r, c;
int maxval;
int mod[4][5] = {2, 3, 4, 5, 8, 0, 3, 4, 5, 6, 0, 1, 2, 4, 7, 1, 4, 6, 7, 8};
void dfs(int x, int y, int val) {
  if (y == c - 2) {
    dfs(x + 1, 0, val);
    return;
  }
  if (x == r - 2) {
    if (val > maxval) {
      maxval = val;
      memcpy(ans, data, sizeof(data));
    }
    return;
  }
  int i, j;
  int cnt = 0;
  for (i = x; i < r; i++)
    for (j = 0; j < c; j++)
      if (data[i][j] == 0) cnt++;
  if (cnt / 5 + val <= maxval) return;
  for (i = 0; i < 4; i++) {
    for (j = 0; j < 5; j++)
      if (data[x + mod[i][j] / 3][y + mod[i][j] % 3] != 0) break;
    if (j < 5) continue;
    for (j = 0; j < 5; j++)
      data[x + mod[i][j] / 3][y + mod[i][j] % 3] = val + 1;
    dfs(x, y + 1, val + 1);
    for (j = 0; j < 5; j++) data[x + mod[i][j] / 3][y + mod[i][j] % 3] = 0;
  }
  dfs(x, y + 1, val);
}
int main() {
  while (scanf("%d%d", &r, &c) != EOF) {
    memset(data, 0, sizeof(data));
    memset(ans, 0, sizeof(ans));
    maxval = 0;
    if (r >= 3 && c >= 3) dfs(0, 0, 0);
    printf("%d\n", maxval);
    int i, j;
    for (i = 0; i < r; i++) {
      for (j = 0; j < c; j++)
        if (ans[i][j] != 0)
          printf("%c", ans[i][j] + 'A' - 1);
        else
          printf(".");
      printf("\n");
    }
  }
}
