#include <bits/stdc++.h>
using namespace std;
char mymap[10][10], best[10][10];
int ans = -1, n, m;
bool shape[4][3][3] = {{{1, 1, 1}, {0, 1, 0}, {0, 1, 0}},
                       {{0, 1, 0}, {0, 1, 0}, {1, 1, 1}},
                       {{1, 0, 0}, {1, 1, 1}, {1, 0, 0}},
                       {{0, 0, 1}, {1, 1, 1}, {0, 0, 1}}};
bool valid(int x, int y, int k) {
  if (x < 0 || x + 2 > n - 1 || y < 0 || y + 2 > m - 1) return false;
  for (int i = 0; i <= 2; i++)
    for (int j = 0; j <= 2; j++) {
      if (shape[k][i][j] && mymap[x + i][y + j] != '.') return false;
    }
  return true;
}
void mtx_insert(int x, int y, int type, int k) {
  for (int i = 0; i <= 2; ++i)
    for (int j = 0; j <= 2; ++j) {
      if (shape[k][i][j]) mymap[x + i][y + j] = 'A' + type;
    };
};
void mtx_clear(int x, int y, int type) {
  int i, j;
  for (i = x; i <= x + 2; i++) {
    for (j = y; j <= y + 2; j++) {
      if (mymap[i][j] == 'A' + type) mymap[i][j] = '.';
    };
  };
};
void mtx_copy() {
  int i, j;
  for (i = 0; i < n; i++) {
    for (j = 0; j < m; j++) {
      best[i][j] = mymap[i][j];
    };
  };
}
void mtx(int x, int y, int type) {
  int i, j, ort;
  if (type + ((n - x - 2) * m + m - y - 1) / 5 <= ans) return;
  if (x == n) return;
  for (i = x; i < n; i++) {
    for (j = (i == x ? y : 0); j < m; j++) {
      for (ort = 0; ort < 4; ort++) {
        if (valid(i, j, ort)) {
          mtx_insert(i, j, type, ort);
          if (j < m - 1)
            mtx(i, j + 1, type + 1);
          else
            mtx(i + 1, 0, type + 1);
          mtx_clear(i, j, type);
        };
      };
    };
  };
  if (type > ans) {
    mtx_copy();
    ans = type;
  };
}
int main() {
  int i, j;
  scanf(" %d %d", &n, &m);
  for (i = 0; i < n; i++) {
    fill_n(mymap[i], m, '.');
    fill_n(best[i], m, '.');
  };
  mtx(0, 0, 0);
  printf("%d\n", ans);
  for (i = 0; i < n; i++) {
    for (j = 0; j < m; j++) {
      printf("%c", best[i][j]);
    };
    printf("\n");
  };
  return 0;
};
