#include <bits/stdc++.h>
using namespace std;
const int N = 104, M = 5004;
char s[N][N], t[N][N];
int n, m, a, b, c;
int z[N][N], tot = 0;
vector<int> g[M];
int co[M], vis[M];
void bfs() {
  memset(co, -1, sizeof(co));
  vis[1] = 1;
  queue<int> q;
  q.push(1);
  while (!q.empty()) {
    int u = q.front();
    q.pop();
    for (int i = 0; i < 26; i++) {
      bool f = 1;
      for (int v : g[u])
        if (co[v] != -1 && co[v] == i) f = 0;
      if (f) {
        co[u] = i;
        break;
      }
    }
    for (int v : g[u]) {
      if (co[v] == -1 && !vis[v]) {
        q.push(v);
        vis[v] = 1;
      }
    }
  }
}
bool solve() {
  if (n & m & 1) return 0;
  bool T = 0;
  if (n & 1) swap(n, m), swap(a, b), T = 1;
  for (int i = 1; i <= n; i += 2)
    for (int j = 1; j <= m / 2 * 2; j += 2) {
      if (c > 0) {
        z[i][j] = z[i + 1][j] = z[i][j + 1] = z[i + 1][j + 1] = ++tot;
        --c;
      } else if (a > 1) {
        z[i][j] = z[i][j + 1] = ++tot;
        z[i + 1][j] = z[i + 1][j + 1] = ++tot;
        a -= 2;
      } else if (b > 1) {
        z[i][j] = z[i + 1][j] = ++tot;
        z[i][j + 1] = z[i + 1][j + 1] = ++tot;
        b -= 2;
      } else
        return 0;
    }
  if (m & 1) {
    for (int i = 1; i <= n; i += 2) {
      if (b == 0) return 0;
      --b;
      z[i][m] = z[i + 1][m] = ++tot;
    }
  }
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= m; j++) {
      int x = z[i][j], y = z[i][j + 1], w = z[i + 1][j];
      if (y && x != y) g[x].push_back(y), g[y].push_back(x);
      if (w && x != w) g[x].push_back(w), g[w].push_back(x);
    }
  bfs();
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= m; j++) t[i][j] = 'a' + co[z[i][j]];
  if (T) {
    for (int i = 1; i <= max(n, m); i++)
      for (int j = i + 1; j <= max(n, m); j++) swap(t[i][j], t[j][i]);
    swap(n, m);
  }
  return 1;
}
int main() {
  cin >> n >> m >> a >> b >> c;
  bool f = solve();
  if (!f)
    puts("IMPOSSIBLE");
  else {
    for (int i = 1; i <= n; i++) puts(t[i] + 1);
  }
}
