#include <bits/stdc++.h>
using namespace std;
const int MAXN = 15;
const char first = 'A';
int n, m;
int total_pieces;
char grid[MAXN][MAXN];
bool pieces[4][3][3] = {{{1, 1, 1}, {0, 1, 0}, {0, 1, 0}},
                        {{0, 0, 1}, {1, 1, 1}, {0, 0, 1}},
                        {{0, 1, 0}, {0, 1, 0}, {1, 1, 1}},
                        {{1, 0, 0}, {1, 1, 1}, {1, 0, 0}}};
bool can_place(int p, int i, int j) {
  if (!(i + 3 <= n && j + 3 <= m)) {
    return false;
  }
  for (int y = i; y < i + 3; y++) {
    for (int x = j; x < j + 3; x++) {
      if (pieces[p][y - i][x - j] && grid[y][x]) {
        return false;
      }
    }
  }
  return true;
}
void place(int p, int i, int j) {
  total_pieces++;
  for (int y = i; y < i + 3; y++) {
    for (int x = j; x < j + 3; x++) {
      if (pieces[p][y - i][x - j]) {
        grid[y][x] = total_pieces;
      }
    }
  }
}
void unplace(int p, int i, int j) {
  total_pieces--;
  for (int y = i; y < i + 3; y++) {
    for (int x = j; x < j + 3; x++) {
      if (pieces[p][y - i][x - j]) {
        grid[y][x] = 0;
      }
    }
  }
}
int best = 0;
char best_sol[MAXN][MAXN];
void solve(int last_i) {
  int still_can_place = 0;
  int num_empty = 0;
  for (int i = last_i; i < n; i++) {
    for (int j = 0; j < m; j++) {
      num_empty += grid[i][j] == 0;
      for (int p = 0; p < 4; p++) {
        if (can_place(p, i, j)) {
          still_can_place++;
          j++;
          break;
        }
      }
    }
  }
  if (total_pieces > best) {
    best = total_pieces;
    for (int i = 0; i < n; i++) {
      for (int j = 0; j < m; j++) {
        best_sol[i][j] = grid[i][j] ? (first - 1 + grid[i][j]) : '.';
      }
      best_sol[i][m] = 0;
    }
  }
  if (best == 13 && n == 9 && m == 9) return;
  if (best == 12 && (n == 8 || m == 8)) return;
  if (best == 10 && (n == 8 && m == 8)) return;
  if (best == 10 && (n == 8 && m == 8)) return;
  if (best == 10 && (n == 7 && m == 9)) return;
  if (best == 10 && (n == 9 && m == 7)) return;
  if (total_pieces + still_can_place <= best || !still_can_place ||
      total_pieces + num_empty / 4 < best) {
    return;
  }
  for (int i = last_i; i < n; i++) {
    for (int j = 0; j < m; j++) {
      for (int p = 0; p < 4; p++) {
        if (can_place(p, i, j)) {
          place(p, i, j);
          solve(i);
          unplace(p, i, j);
        }
      }
    }
  }
}
int main() {
  cin >> n >> m;
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
      best_sol[i][j] = '.';
    }
    best_sol[i][m] = 0;
  }
  solve(0);
  cout << best << endl;
  for (int i = 0; i < n; i++) {
    printf("%s\n", best_sol[i]);
  }
  return 0;
}
