#include <bits/stdc++.h>
using namespace std;
namespace IO {
template <class T>
inline void read(T &x) {
  x = 0;
  int f = 1;
  char ch = getchar();
  while (ch < '0' || ch > '9') {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  while (ch <= '9' && ch >= '0') x = x * 10 + ch - '0', ch = getchar();
  x *= f;
}
};  // namespace IO
using namespace IO;
const int N = 1005;
const int M = 1000005;
const long long oo = 1e18 + 5;
const unsigned long long Seed = 131;
int n, m, indx, tagL, tagR;
char ch[N];
long long K;
unsigned long long GetHash[N][N], Hash[N], bin[N];
long long dp[N][N], res[N];
vector<int> E[N];
struct S {
  int L, R;
  S() {}
  S(int _L, int _R) { L = _L, R = _R; }
  void print() {
    for (int i = (L); i <= (R); ++i) printf("%c", ch[i]);
    printf(" ");
  }
} s[M];
bool cmp(S x, S y) {
  if (ch[x.L] != ch[y.L]) return ch[x.L] < ch[y.L];
  int xL = x.L, yL = y.L, xlen = x.R - x.L + 1, ylen = y.R - y.L + 1,
      Mnlen = ((xlen) < (ylen) ? (xlen) : (ylen)), L = 0, R = Mnlen;
  while (L < R) {
    int mid = (L + R + 1) >> 1;
    if ((GetHash[xL][mid] ? GetHash[xL][mid]
                          : GetHash[xL][mid] =
                                Hash[xL + mid - 1] - Hash[xL - 1] * bin[mid]) ==
        (GetHash[yL][mid]
             ? GetHash[yL][mid]
             : GetHash[yL][mid] = Hash[yL + mid - 1] - Hash[yL - 1] * bin[mid]))
      L = mid;
    else
      R = mid - 1;
  }
  if (L < Mnlen)
    return ch[xL + L] < ch[yL + L];
  else {
    return (xlen == Mnlen);
  }
}
int lcp(S x, S y) {
  if (ch[x.L] != ch[y.L]) return 0;
  int xL = x.L, yL = y.L, xlen = x.R - x.L + 1, ylen = y.R - y.L + 1,
      Mnlen = ((xlen) < (ylen) ? (xlen) : (ylen)), L = 0, R = Mnlen;
  while (L < R) {
    int mid = (L + R + 1) >> 1;
    if ((GetHash[xL][mid] ? GetHash[xL][mid]
                          : GetHash[xL][mid] =
                                Hash[xL + mid - 1] - Hash[xL - 1] * bin[mid]) ==
        (GetHash[yL][mid]
             ? GetHash[yL][mid]
             : GetHash[yL][mid] = Hash[yL + mid - 1] - Hash[yL - 1] * bin[mid]))
      L = mid;
    else
      R = mid - 1;
  }
  return L;
}
long long calc(int pos) {
  memset(res, 0, sizeof(res));
  memset(dp, 0, sizeof(dp));
  for (int i = (1); i <= (n); ++i) E[i].clear();
  long long resminus = 0;
  for (int i = (1); i <= (n); ++i) {
    int temp = lcp(S(i, n), s[pos]);
    if (temp == s[pos].R - s[pos].L + 1)
      E[i + temp - 1].push_back(i);
    else if (i + temp <= n && ch[i + temp] > ch[s[pos].L + temp]) {
      E[i + temp].push_back(i);
    }
  }
  for (int i = (1); i <= (n); ++i) {
    for (__typeof(E[i].begin()) it = E[i].begin(); it != E[i].end(); ++it) {
      int y = *it;
      if (y == 1)
        ++resminus;
      else {
        for (int j = (0); j <= (m - 1); ++j) {
          res[j] =
              ((res[j] + dp[y - 1][j]) < (oo) ? (res[j] + dp[y - 1][j]) : (oo));
        }
      }
    }
    for (int j = (1); j <= (m - 1); ++j) dp[i][j] = res[j - 1];
    dp[i][0] = resminus;
  }
  return dp[n][m - 1];
}
int main() {
  scanf("%d %d %lld\n", &n, &m, &K);
  scanf("%s\n", ch + 1);
  bin[0] = 1;
  for (int i = (1); i <= (n); ++i) bin[i] = bin[i - 1] * Seed;
  for (int i = (1); i <= (n); ++i)
    Hash[i] = Hash[i - 1] * Seed + ch[i] - 'a' + 1;
  for (int i = (1); i <= (n); ++i)
    for (int j = (i); j <= (n); ++j) s[++indx].L = i, s[indx].R = j;
  stable_sort(s + 1, s + indx + 1, cmp);
  int L = 1, R = indx;
  while (L < R) {
    int mid = (L + R + 1) >> 1;
    if (calc(mid) >= K)
      L = mid;
    else
      R = mid - 1;
  }
  s[L].print();
  printf("\n");
  return 0;
}
