#include <bits/stdc++.h>
using namespace std;
int w[105][105];
char u[105][105];
inline void put(int i, int j, char type, int cnt) {
  if (type == 'a') {
    w[i][j] = cnt;
    w[i][j + 1] = cnt;
  }
  if (type == 'b') {
    w[i][j] = cnt;
    w[i + 1][j] = cnt;
  }
  if (type == 'c') {
    w[i][j] = cnt;
    w[i][j + 1] = cnt;
    w[i + 1][j] = cnt;
    w[i + 1][j + 1] = cnt;
  }
}
int main() {
  int n, m, a, b, c;
  int cn = 0, cm = 0;
  cin >> n >> m >> a >> b >> c;
  int s1 = (2 * (a + b) + 4 * c);
  int s2 = n * m;
  if (s2 > s1) {
    cout << "IMPOSSIBLE" << endl;
    exit(0);
  }
  int cnt = 1;
  if (((n % 2 == 1) && (m % 2 == 1))) {
    cout << "IMPOSSIBLE" << endl;
    exit(0);
  }
  if ((n % 2 == 0) && (m % 2 == 1)) {
    if (n > 2 * b) {
      cout << "IMPOSSIBLE" << endl;
      exit(0);
    }
    for (int i = 0; i < n; i += 2) put(i, m - 1, 'b', cnt), cnt++, b--, s2 -= 2;
    m--;
    cm++;
  }
  if ((n % 2 == 1) && (m % 2 == 0)) {
    if (m > 2 * a) {
      cout << "IMPOSSIBLE" << endl;
      exit(0);
    }
    for (int i = 0; i < m; i += 2) put(n - 1, i, 'a', cnt), cnt++, a--, s2 -= 2;
    n--;
    cn++;
  }
  if ((n % 2 == 0) && (m % 2 == 0)) {
    for (int i = 0; i < n; i += 2)
      for (int j = 0; j < m; j += 2) {
        if (a > 1) {
          put(i, j, 'a', cnt);
          cnt++;
          put(i + 1, j, 'a', cnt);
          cnt++;
          a -= 2;
          s2 -= 4;
        } else if (b > 1) {
          put(i, j, 'b', cnt);
          cnt++;
          put(i, j + 1, 'b', cnt);
          cnt++;
          b -= 2;
          s2 -= 4;
        } else if (c > 0) {
          put(i, j, 'c', cnt);
          cnt++;
          c--;
          s2 -= 4;
        }
      }
  }
  n += cn;
  m += cm;
  if (s2 != 0) {
    cout << "IMPOSSIBLE" << endl;
    exit(0);
  }
  int dx[] = {0, 1, 0, -1}, dy[] = {1, 0, -1, 0};
  map<int, set<int> > met;
  for (int _n((n)-1), i(0); i <= _n; i++)
    for (int _n((m)-1), j(0); j <= _n; j++)
      for (int _n((4) - 1), k(0); k <= _n; k++)
        if (0 <= i + dx[k] && i + dx[k] < n && 0 <= j + dy[k] && j + dy[k] < m)
          if (w[i + dx[k]][j + dy[k]] != w[i][j])
            met[w[i][j]].insert(w[i + dx[k]][j + dy[k]]);
  map<int, char> dp;
  for (int _n((cnt - 1)), i(1); i <= _n; i++) {
    for (char r = 'a'; r <= 'z'; r++) {
      bool canbe = true;
      for (set<int>::iterator it = met[i].begin(); it != met[i].end(); it++)
        if (r == dp[(*it)]) {
          canbe = false;
          break;
        }
      if (canbe) {
        dp[i] = r;
        break;
      }
    }
  }
  for (int _n((n)-1), i(0); i <= _n; i++)
    for (int _n((m)-1), j(0); j <= _n; j++) u[i][j] = dp[w[i][j]];
  for (int _n((n)-1), i(0); i <= _n; i++) {
    for (int _n((m)-1), j(0); j <= _n; j++) printf("%c", u[i][j]);
    printf("\n");
  }
  return 0;
}
