#include <bits/stdc++.h>
#pragma comment(linker, "/STACK:64000000")
using namespace std;
void __never(int a) { printf("\nOPS %d", a); }
int dx[] = {0, 1, -1, 0};
int dy[] = {1, 0, 0, -1};
int r[128][128];
char g[128][128];
int id = 0;
bool nco[32];
int n, m;
pair<int, int> ord[128 * 128];
int be, en;
bool flag[128][128];
void init() {
  freopen("input.txt", "r", stdin);
  freopen("output.txt", "w", stdout);
}
void bfs(int x, int y) {
  int col = r[x][y];
  ord[be = en = 1] = make_pair(x, y);
  flag[x][y] = true;
  memset(nco, 0, sizeof(nco));
  while (be <= en) {
    pair<int, int> cur = ord[be++];
    for (int(i) = (0); (i) <= (3); ++(i)) {
      int hx = cur.first + dx[i];
      int hy = cur.second + dy[i];
      if (hx < 0 || hx >= n || hy < 0 || hy >= m) continue;
      if (flag[hx][hy]) {
        if (r[hx][hy] != col) {
          {
            if (!(g[hx][hy] >= 'a')) {
              __never(55);
              cout.flush();
              cerr.flush();
              abort();
            }
          };
          nco[g[hx][hy] - 'a'] = true;
        }
        continue;
      }
      if (r[hx][hy] != col) continue;
      ord[++en] = make_pair(hx, hy);
      flag[hx][hy] = true;
    }
  }
}
bool sol() {
  int a, b, c;
  cin >> n >> m >> a >> b >> c;
  if (n * m % 2 == 1) return false;
  bool rev = false;
  if (n % 2 == 1) {
    {
      if (!(m % 2 == 0)) {
        __never(72);
        cout.flush();
        cerr.flush();
        abort();
      }
    };
    swap(n, m);
    swap(a, b);
    rev = true;
  }
  if (m % 2 == 1) {
    int needb = n / 2;
    if (b < needb) return false;
    for (int(i) = (0); (i) <= (n - 1); ++(i))
      if (i % 2 == 0) {
        r[i][m - 1] = r[i + 1][m - 1] = ++id;
        b--;
      }
  }
  int A = a / 2, B = b / 2;
  int oddm = m % 2;
  if ((A + B + c) * 4 < n * (m - oddm)) return false;
  for (int(i) = (0); (i) <= (n - 1); ++(i))
    if (i % 2 == 0) {
      for (int(j) = (0); (j) <= (m - 2); ++(j))
        if (j % 2 == 0) {
          if (A > 0) {
            r[i][j] = r[i][j + 1] = ++id;
            r[i + 1][j] = r[i + 1][j + 1] = ++id;
            a -= 2;
            A--;
          } else if (B > 0) {
            r[i][j] = r[i + 1][j] = ++id;
            r[i][j + 1] = r[i + 1][j + 1] = ++id;
            b -= 2;
            B--;
          } else {
            {
              if (!(c > 0)) {
                __never(102);
                cout.flush();
                cerr.flush();
                abort();
              }
            };
            r[i][j] = r[i + 1][j] = r[i][j + 1] = r[i + 1][j + 1] = ++id;
            c--;
          }
        }
    }
  {
    if (!(a >= 0 && b >= 0 && c >= 0)) {
      __never(108);
      cout.flush();
      cerr.flush();
      abort();
    }
  };
  memset(flag, 0, sizeof(flag));
  for (int(i) = (0); (i) <= (n - 1); ++(i))
    for (int(j) = (0); (j) <= (m - 1); ++(j))
      if (!flag[i][j]) {
        bfs(i, j);
        int next = 0;
        for (int(i) = (0); (i) <= (32); ++(i))
          if (!nco[i]) {
            next = i;
            break;
          }
        for (int(k) = (1); (k) <= (en); ++(k))
          g[ord[k].first][ord[k].second] = next + 'a';
      }
  if (rev) {
    for (int(j) = (0); (j) <= (m - 1); ++(j)) {
      for (int(i) = (0); (i) <= (n - 1); ++(i)) printf("%c", g[i][j]);
      printf("\n");
    }
  } else {
    for (int(i) = (0); (i) <= (n - 1); ++(i)) {
      for (int(j) = (0); (j) <= (m - 1); ++(j)) printf("%c", g[i][j]);
      printf("\n");
    }
  }
  return true;
}
int main() {
  if (!sol()) printf("IMPOSSIBLE");
  return 0;
}
