#include <bits/stdc++.h>
using namespace std;
const int INF = INT_MAX;
const int NINF = INT_MIN;
const long long INF_LL = LLONG_MAX;
const long long NINF_LL = LLONG_MIN;
const double PI = acos(-1.0);
const int MOD = 1e9 + 7;
inline long long pos_m(long long first, long long c = MOD) {
  while (first < 0) {
    first += c;
  }
  return first;
}
inline long long add_m(long long first, long long second, long long c = MOD) {
  first = pos_m(first, c), second = pos_m(second, c);
  return (first + second) % c;
}
inline long long mul_m(long long first, long long second, long long c = MOD) {
  first = pos_m(first, c), second = pos_m(second, c);
  return (first * second) % c;
}
inline long long sub_m(long long first, long long second, long long c = MOD) {
  first = pos_m(first, c), second = pos_m(second, c);
  return pos_m((first - second) % c, c);
}
inline long long pow_m(long long first, long long second, long long c = MOD) {
  first = pos_m(first, c);
  long long ret = 1;
  while (second) {
    if (second & 1) ret = mul_m(first, ret, c);
    first = mul_m(first, first, c);
    second >>= 1;
  }
  return ret;
}
int main() {
  int n, l, k;
  scanf("%d %d %d%*c", &n, &l, &k);
  string str;
  getline(cin, str);
  sort((str).begin(), (str).end());
  vector<string> dict(n, "");
  int last_used_char_idx = -1;
  int start_idx = 0;
  for (int char_idx = 0; char_idx < l; ++char_idx) {
    int num_occ = 0;
    char prev_char = 'a' - 1;
    for (int idx = (start_idx); idx <= (k - 1); ++idx) {
      char c = str[++last_used_char_idx];
      if (prev_char != c) {
        num_occ = 0;
      }
      num_occ++;
      dict[idx] += c;
      prev_char = c;
    }
    start_idx = (k - 1) - (num_occ - 1);
  }
  for (int idx = 0; idx < n; ++idx) {
    while (dict[idx].length() < l) dict[idx] += str[++last_used_char_idx];
    printf("%s\n", dict[idx].c_str());
  }
  return 0;
}
