#include <bits/stdc++.h>
using namespace std;
struct vl {
  long long u, v;
};
long long n, l, k, a[26] = {0}, t, x, y;
deque<vl> b;
string s, ans[20000];
void add(string& ss, bool type) {
  if (type) {
    ss += (char)(b.front().u + 'a');
    b.front().v--;
    if (b.front().v == 0) b.pop_front();
  } else {
    ss += (char)(b.back().u + 'a');
    b.back().v--;
    if (b.back().v == 0) b.pop_back();
  }
}
int main() {
  cin >> n >> l >> k >> s;
  t = k * l;
  for (long long i = 0; i < s.length(); i++) a[s[i] - 'a']++;
  for (long long i = 0; i < 26; i++) {
    if (t == 0) break;
    if (a[i] != 0) {
      b.push_back(vl());
      b.back().u = i;
      b.back().v = min(a[i], t);
      t -= b.back().v;
      a[i] -= b.back().v;
    }
  }
  for (long long i = 0; i <= n + 1; i++) ans[i] = "0";
  for (long long i = 1; i <= k; i++) add(ans[i], 1);
  for (long long i = 0; i < l - 1; i++) {
    for (long long j = 1; j <= k; j++) {
      while (ans[j][ans[j].length() - 1] == ans[j + 1][ans[j + 1].length() - 1])
        j++;
      x = j;
      if (j < k) {
        add(ans[j], 0);
        while (ans[j][ans[j].length() - 2] ==
                   ans[j - 1][ans[j - 1].length() - 1] &&
               ans[j].length() == ans[j - 1].length() + 1) {
          j--;
          add(ans[j], 0);
        }
        j = x;
      } else {
        while (ans[j].length() == ans[j - 1].length()) j--;
        while (j <= k) {
          add(ans[j], 1);
          j++;
        }
        break;
      }
    }
  }
  for (long long i = 0; i < 26; i++) {
    if (a[i] != 0) {
      b.push_back(vl());
      b.back().u = i;
      b.back().v = a[i];
    }
  }
  for (long long i = 0; i < l; i++) {
    for (long long j = k + 1; j <= n; j++) {
      add(ans[j], 1);
    }
  }
  for (long long i = 1; i <= n; i++)
    cout << ans[i].substr(1, ans[i].length() - 1) << endl;
}
