#include <bits/stdc++.h>
using namespace std;
template <typename T>
inline void read(T &x) {
  x = 0;
  char c = getchar();
  bool flag = false;
  while (!isdigit(c)) {
    if (c == '-') flag = true;
    c = getchar();
  }
  while (isdigit(c)) {
    x = (x << 1) + (x << 3) + (c ^ 48);
    c = getchar();
  }
  if (flag) x = -x;
}
long long n, m, k, cnt, l, r;
int lcp[1010][1010];
long long f[1010][1010], g[1010][1010];
char s[1010];
struct node {
  int l, r;
} t[1000010];
bool cmp(const node &a, const node &b) {
  int la = a.r - a.l + 1, lb = b.r - b.l + 1, len = lcp[a.l][b.l];
  if (len >= la || len >= lb) return la < lb;
  return s[a.l + len] < s[b.l + len];
}
bool check(int x) {
  memset(f, 0, sizeof(f)), memset(g, 0, sizeof(g));
  f[n + 1][0] = g[n + 1][0] = 1;
  for (int i = n; i; --i) {
    int len = min(lcp[i][t[x].l], t[x].r - t[x].l + 1);
    if (len == t[x].r - t[x].l + 1 || s[i + len] > s[t[x].l + len])
      for (int j = 1; j <= m; ++j) f[i][j] = g[i + len + 1][j - 1];
    for (int j = 0; j <= m; ++j) {
      g[i][j] = g[i + 1][j] + f[i][j];
      if (g[i][j] > k) g[i][j] = k;
    }
  }
  return f[1][m] >= k;
}
int main() {
  read(n), read(m), read(k), scanf("%s", s + 1);
  for (int i = n; i; --i)
    for (int j = n; j; --j)
      if (s[i] == s[j]) lcp[i][j] = lcp[i + 1][j + 1] + 1;
  for (int i = 1; i <= n; ++i)
    for (int j = i; j <= n; ++j) t[++cnt] = {i, j};
  sort(t + 1, t + cnt + 1, cmp), l = 1, r = cnt;
  while (l <= r) {
    int mid = (l + r) >> 1;
    if (check(mid))
      l = mid + 1;
    else
      r = mid - 1;
  }
  for (int i = t[l].l; i <= t[l].r; ++i) putchar(s[i]);
  return 0;
}
