#include <bits/stdc++.h>
const int maxn = 1005;
const int maxN = 1e6 + 22;
using ll = long long;
const ll inf = 1e18 + 22;
int n, m, tl, ch[maxN][26], dfn[maxN], p[maxn], idx;
ll S[maxn][maxn], f[maxn][maxn], k;
char s[maxn];
std::vector<int> vec;
void dfs2(int u, int x) {
  if (dfn[u] == x) {
    for (auto c : vec) printf("%c", c + 'a');
    return;
  }
  for (int i = 0; i < 26; ++i) {
    if (ch[u][i]) {
      vec.push_back(i);
      dfs2(ch[u][i], x);
      vec.pop_back();
    }
  }
}
void output(int x) { dfs2(1, x); }
int check(int x) {
  std::memset(S, 0, sizeof(S));
  f[0][n + 1] = 1;
  for (int i = 1; i <= n + 1; ++i) S[0][i] = 1;
  for (int i = 1; i <= n; ++i) {
    p[i] = 0;
    int rt = 1;
    while (i + p[i] <= n && dfn[ch[rt][s[i + p[i]] - 'a']] <= x) {
      rt = ch[rt][s[i + p[i]] - 'a'];
      p[i]++;
    }
  }
  for (int i = 1; i <= m; ++i) {
    for (int j = n; j >= 1; j--) {
      int l = j + p[j];
      f[i][j] = S[i - 1][l + 1];
    }
    for (int j = n; j >= 1; j--) S[i][j] = std::min(inf, S[i][j + 1] + f[i][j]);
  }
  return f[m][1] >= k;
}
void dfs(int u) {
  dfn[u] = ++idx;
  for (int i = 0; i < 26; ++i) {
    if (ch[u][i]) dfs(ch[u][i]);
  }
}
int main() {
  scanf("%d%d%lld%s", &n, &m, &k, s + 1);
  tl = 1;
  for (int i = 1; i <= n; ++i) {
    int rt = 1;
    for (int j = i; j <= n; ++j) {
      if (!ch[rt][s[j] - 'a']) ch[rt][s[j] - 'a'] = ++tl;
      rt = ch[rt][s[j] - 'a'];
    }
  }
  dfs(1);
  int l = 2, r = idx, ans = 0;
  while (l <= r) {
    int mid = (l + r) >> 1;
    if (check(mid)) {
      l = mid + 1;
    } else {
      ans = mid;
      r = mid - 1;
    }
  }
  output(ans);
  return 0;
}
