#include <bits/stdc++.h>
using namespace std;
int countbit(int n) { return (n == 0) ? 0 : (1 + countbit(n & (n - 1))); }
int lowbit(int n) { return (n ^ (n - 1)) & n; }
const double pi = acos(-1.0);
const double eps = 1e-11;
int n, m;
int maxNum;
char str[3][13] = {"AAA.A.A....A", ".A..A.AAAAAA", ".A.AAAA....A"};
char ans[10][10];
char path[10][10];
int check(int r, int c, int x) {
  if (r + 3 > n || c + 3 > m) return 0;
  for (int i = 0; i < 3; ++i)
    for (int j = 0; j < 3; ++j) {
      if (str[i][x * 3 + j] == 'A' && path[r + i][c + j] != '.') return 0;
    }
  return 1;
}
void update(int r, int c, int x, int num, int bit) {
  for (int i = 0; i < 3; ++i)
    for (int j = 0; j < 3; ++j) {
      if (str[i][x * 3 + j] == 'A')
        path[r + i][c + j] = bit ? str[i][x * 3 + j] + num : '.';
    }
}
void dfs(int r, int c, int num) {
  int left = (n - r - 1) * m;
  if (num + left / 5 <= maxNum) return;
  if (num > maxNum) {
    maxNum = num;
    memcpy(ans, path, sizeof(ans));
  }
  if (r == n) return;
  if (c == m) {
    dfs(r + 1, 0, num);
    return;
  }
  for (int i = 0; i < 4; ++i) {
    if (check(r, c, i)) {
      update(r, c, i, num, 1);
      dfs(r, c + 1, num + 1);
      update(r, c, i, num, 0);
    }
  }
  dfs(r, c + 1, num);
}
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 0; i < n; ++i)
    for (int j = 0; j < m; ++j) path[i][j] = ans[i][j] = '.';
  dfs(0, 0, 0);
  printf("%d\n", maxNum);
  for (int i = 0; i < n; ++i) printf("%s\n", ans[i]);
  return 0;
}
