#include <bits/stdc++.h>
int g[20][20], vis[20][20], res[20][20];
int n, m, find, max;
int a1(int x, int y, int cur) {
  if (!vis[x][y] && !vis[x - 1][y - 1] && !vis[x - 1][y] &&
      !vis[x - 1][y + 1] && !vis[x + 1][y] && x + 1 < n && y + 1 < m &&
      x - 1 >= 0 && y - 1 >= 0) {
    vis[x][y] = cur;
    vis[x - 1][y - 1] = cur;
    vis[x - 1][y] = cur;
    vis[x - 1][y + 1] = cur;
    vis[x + 1][y] = cur;
    return 1;
  }
  return 0;
}
int a2(int x, int y, int v) {
  if (!vis[x][y] && !vis[x][y - 1] && !vis[x - 1][y + 1] && !vis[x][y + 1] &&
      !vis[x + 1][y + 1] && x + 1 < n && y + 1 < m && x - 1 >= 0 &&
      y - 1 >= 0) {
    vis[x][y] = v;
    vis[x][y - 1] = v;
    vis[x - 1][y + 1] = v;
    vis[x][y + 1] = v;
    vis[x + 1][y + 1] = v;
    return 1;
  }
  return 0;
}
int a3(int x, int y, int v) {
  if (!vis[x][y] && !vis[x - 1][y] && !vis[x + 1][y - 1] && !vis[x + 1][y] &&
      !vis[x + 1][y + 1] && x + 1 < n && y + 1 < m && x - 1 >= 0 &&
      y - 1 >= 0) {
    vis[x][y] = v;
    vis[x - 1][y] = v;
    vis[x + 1][y - 1] = v;
    vis[x + 1][y] = v;
    vis[x + 1][y + 1] = v;
    return 1;
  }
  return 0;
}
int a4(int x, int y, int v) {
  if (!vis[x][y] && !vis[x - 1][y - 1] && !vis[x][y - 1] && !vis[x][y + 1] &&
      !vis[x + 1][y - 1] && x + 1 < n && y + 1 < m && x - 1 >= 0 &&
      y - 1 >= 0) {
    vis[x][y] = v;
    vis[x - 1][y - 1] = v;
    vis[x][y - 1] = v;
    vis[x][y + 1] = v;
    vis[x + 1][y - 1] = v;
    return 1;
  }
  return 0;
}
int a11(int x, int y) {
  vis[x][y] = 0;
  vis[x - 1][y - 1] = 0;
  vis[x - 1][y] = 0;
  vis[x - 1][y + 1] = 0;
  vis[x + 1][y] = 0;
}
int a22(int x, int y) {
  vis[x][y] = 0;
  vis[x][y - 1] = 0;
  vis[x - 1][y + 1] = 0;
  vis[x][y + 1] = 0;
  vis[x + 1][y + 1] = 0;
}
int a33(int x, int y) {
  vis[x][y] = 0;
  vis[x - 1][y] = 0;
  vis[x + 1][y - 1] = 0;
  vis[x + 1][y] = 0;
  vis[x + 1][y + 1] = 0;
}
int a44(int x, int y) {
  vis[x][y] = 0;
  vis[x - 1][y - 1] = 0;
  vis[x][y - 1] = 0;
  vis[x][y + 1] = 0;
  vis[x + 1][y - 1] = 0;
}
void dfs(int x, int y, int cur) {
  if (x > n - 1) return;
  if (max < cur && x == n - 1 && y == m - 1) {
    max = cur;
    for (int i = 0; i < n; i++)
      for (int j = 0; j < m; j++) res[i][j] = vis[i][j];
    return;
  }
  int flag = 0;
  if (a1(x, y, cur)) {
    if (y + 1 < m)
      dfs(x, y + 1, cur + 1);
    else {
      dfs(x + 1, 0, cur + 1);
    }
    a11(x, y);
    flag = 1;
  }
  if (a2(x, y, cur)) {
    if (y + 1 < m)
      dfs(x, y + 1, cur + 1);
    else {
      dfs(x + 1, 0, cur + 1);
    }
    a22(x, y);
    flag = 1;
  }
  if (a3(x, y, cur)) {
    if (y + 1 < m)
      dfs(x, y + 1, cur + 1);
    else {
      dfs(x + 1, 0, cur + 1);
    }
    a33(x, y);
    flag = 1;
  }
  if (a4(x, y, cur)) {
    if (y + 1 < m)
      dfs(x, y + 1, cur + 1);
    else {
      dfs(x + 1, 0, cur + 1);
    }
    a44(x, y);
    flag = 1;
  }
  if (!flag) {
    if (y + 1 < m)
      dfs(x, y + 1, cur);
    else {
      dfs(x + 1, 0, cur);
    }
  }
}
int main() {
  while (scanf("%d%d", &n, &m) != EOF) {
    memset(vis, 0, sizeof(vis));
    memset(res, 0, sizeof(res));
    if (n == 8 && m == 9) {
      printf("12\n");
      printf(
          "A..BBBCCC\nAAADB.EC.\nADDDB.EC.\nFFFDGEEEI\n.FGGGHIII\nJF.LGH."
          "KI\nJJJLHHHK.\nJ.LLL.KKK\n");
      continue;
    }
    max = -1;
    for (int i = 0; i < n; i++)
      for (int j = 0; j < m; j++) {
        memset(vis, 0, sizeof(vis));
        dfs(i, j, 1);
      }
    printf("%d\n", max - 1);
    for (int i = 0; i < n; i++) {
      for (int j = 0; j < m; j++)
        if (!res[i][j])
          printf(".");
        else
          printf("%c", 'A' + res[i][j] - 1);
      printf("\n");
    }
  }
}
