#include <bits/stdc++.h>
using namespace std;
const long long INF = 2e18;
long long dp[1010][1010];
int n, m;
long long k;
char s[1010];
int to[1010];
void add(long long& x, long long y) {
  x += y;
  if (x > INF) x = INF;
  return;
}
bool solve(int l, int r) {
  for (int i = 1; i <= n; i++) {
    to[i] = 0;
    for (int j = i; j <= n; j++)
      if (s[j] > s[l + j - i]) {
        to[i] = j;
        break;
      } else if (s[j] < s[l + j - i]) {
        to[i] = 0;
        break;
      } else if (j - i == r - l) {
        to[i] = j;
        break;
      }
  }
  memset(dp, 0, sizeof(dp));
  dp[0][0] = 1;
  for (int i = 1; i <= m; i++)
    for (int j = 1; j <= n; j++) {
      if (to[j]) add(dp[i][to[j]], dp[i - 1][j - 1]);
      add(dp[i][j], dp[i][j - 1]);
    }
  return dp[m][n] >= k;
}
struct Trie {
  int ch[26];
  int l, r;
} T[1000010];
int tot = 1;
int trans(int x, int c, int l, int r) {
  if (!T[x].ch[c]) {
    T[x].ch[c] = ++tot;
    T[tot].l = l;
    T[tot].r = r;
  }
  return T[x].ch[c];
}
int L[1000010], R[1000010], N;
void dfs(int u) {
  if (T[u].l) {
    L[++N] = T[u].l;
    R[N] = T[u].r;
  }
  for (int i = 0; i < 26; i++)
    if (T[u].ch[i]) dfs(T[u].ch[i]);
  return;
}
int main() {
  scanf("%d %d %I64d", &n, &m, &k);
  scanf("%s", s + 1);
  for (int i = 1; i <= n; i++) {
    int now = 1;
    for (int j = i; j <= n; j++) now = trans(now, s[j] - 'a', i, j);
  }
  dfs(1);
  int l = 1, r = N + 1;
  while (l + 1 < r) {
    int mid = (l + r) >> 1;
    if (solve(L[mid], R[mid]))
      l = mid;
    else
      r = mid;
  }
  for (int i = L[l]; i <= R[l]; i++) printf("%c", s[i]);
  printf("\n");
  return 0;
}
