#include <bits/stdc++.h>
using namespace std;
void dfs(char* grid, int stride, int k, int* c, int z) {
  if (!z) return;
  int next = lower_bound(c, c + 26, k) - c;
  int tot = 0;
  for (int i = 0; i < next; i++) {
    while (tot < c[i]) {
      grid[tot * stride] = ('a' + i);
      tot++;
    }
    c[i] = 0;
  }
  int base = tot;
  while (tot < k) {
    grid[tot * stride] = ('a' + next);
    tot++;
  }
  for (int i = next; i < 26; i++) c[i] -= tot;
  dfs(grid + base * stride + 1, stride, k - base, c, z - 1);
}
int main() {
  int n, l, k;
  cin >> n >> l >> k;
  int m = n * l;
  string s;
  cin >> s;
  int c[26];
  fill(c, c + 26, 0);
  for (int i = 0; i < m; i++) c[s[i] - 'a']++;
  for (int i = 1; i < 26; i++) c[i] += c[i - 1];
  vector<char> grid(m, '?');
  dfs(grid.data(), l, k, c, l);
  for (int i = 25; i > 0; i--) c[i] -= c[i - 1];
  int j = 0;
  for (int i = 0; i < m; i++) {
    while (c[j] == 0) j++;
    if (grid[i] == '?') {
      grid[i] = (j + 'a');
      c[j]--;
    }
  }
  for (int i = 0; i < n; i++) {
    cout << string(grid.begin() + i * l, grid.begin() + (i + 1) * l) << endl;
  }
}
