#include <bits/stdc++.h>
using namespace std;
long long cnk[1050][1050];
int n, m;
long long k;
string s;
string ans;
int bor[1005000][26];
int sz = 0;
vector<string> ss;
string curs;
void dfs(int ind) {
  ss.push_back(curs);
  for (int i = 0; i < 26; ++i)
    if (bor[ind][i]) {
      curs.push_back('a' + i);
      dfs(bor[ind][i]);
      curs.pop_back();
    }
}
void add(long long& x, long long y) {
  x += y;
  x = min(x, k + 1);
}
long long dp[1050][1050];
long long getKol(const string& subs) {
  memset(dp, 0, sizeof(dp));
  dp[0][0] = 1;
  for (int i = 0; i < n; ++i) {
    int v = 0;
    while (v < (int)subs.size() && i + v < n && s[i + v] == subs[v]) ++v;
    int ni = -1;
    if (v == (int)subs.size())
      ni = i + v;
    else if (i + v == n)
      ni = -1;
    else if (s[i + v] > subs[v])
      ni = i + v + 1;
    else
      ni = -1;
    for (int j = 0; j < m; ++j)
      if (dp[i][j]) {
        if (i > 0) add(dp[i + 1][j], dp[i][j]);
        if (ni > i) add(dp[ni][j + 1], dp[i][j]);
      }
  }
  long long ans = 0;
  for (int i = 0; i <= n; ++i) add(ans, dp[i][m]);
  return ans;
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cin >> n >> m >> k >> s;
  for (int i = 0; i < n; ++i) {
    int ind = 0;
    for (int j = i; j < n; ++j) {
      int v = s[j] - 'a';
      if (bor[ind][v] == 0) bor[ind][v] = ++sz;
      ind = bor[ind][v];
    }
  }
  curs = "";
  dfs(0);
  reverse(ss.begin(), ss.end());
  int l = -1;
  int r = (int)ss.size();
  while (l + 1 < r) {
    int mid = (l + r) / 2;
    if (getKol(ss[mid]) >= k)
      r = mid;
    else
      l = mid;
  }
  cout << ss[r] << endl;
  return 0;
}
