#include <bits/stdc++.h>
#pragma GCC target("avx2")
#pragma GCC optimization("O3")
#pragma GCC optimization("unroll-loops")
using namespace std;
using ll = long long;
using ld = long double;
const ll MOD = 998244353;
const ll root = 62;
ll gcd(ll a, ll b) { return b ? gcd(b, a % b) : a; }
ll binpow(ll a, ll b) {
  ll res = 1;
  while (b) {
    if (b & 1) res = (res * a) % MOD;
    a = (a * a) % MOD;
    b >>= 1;
  }
  return res;
}
ll modInv(ll a) { return binpow(a, MOD - 2); }
const double PI = acos(-1);
const double eps = 1e-10;
const int INF = 0x3f3f3f3f;
const int NINF = 0xc0c0c0c0;
const ll INFLL = 0x3f3f3f3f3f3f3f3f;
const ll NINFLL = 0xc0c0c0c0c0c0c0c0;
const int mxN = 1001;
string s;
ll dp[mxN][mxN][2];
ll dpsum[mxN];
ll at[mxN][mxN];
int lcp[mxN][mxN];
ll k;
int nxt[mxN];
int n, m;
vector<pair<int, int>> vv;
ll add(ll &a, ll &b) { return min(k, a + b); }
bool check(int a) {
  string t = s.substr(vv[a].first, vv[a].second - vv[a].first);
  memset(dp, 0, sizeof(dp));
  memset(dpsum, 0, sizeof(dpsum));
  memset(at, 0, sizeof(at));
  for (auto i = (0); i < (n); ++i) {
    string comp = s.substr(i, n - i);
    int curr = 0;
    while (1) {
      if (curr == t.size()) {
        nxt[i] = curr;
        break;
      } else if (curr == comp.size()) {
        nxt[i] = -1;
        break;
      } else if (comp[curr] > t[curr]) {
        nxt[i] = curr + 1;
        break;
      } else if (comp[curr] == t[curr]) {
        curr++;
      } else {
        nxt[i] = -1;
        break;
      }
    }
  }
  if (nxt[0] == -1) return 0;
  dp[0][1][1] = 1;
  at[0 + nxt[0]][2] = 1;
  for (auto i = (1); i < (n); ++i) {
    for (auto j = (0); j < (min(i + 2, m + 1)); ++j) {
      dp[i][j][0] = add(dp[i - 1][j][0], dp[i - 1][j][1]);
      dpsum[j] = add(dpsum[j], at[i][j]);
      if (nxt[i] != -1) {
        dp[i][j][1] = dpsum[j];
        at[i + nxt[i]][j + 1] = add(at[i + nxt[i]][j + 1], dpsum[j]);
      }
    }
  }
  return add(dp[n - 1][m][0], dp[n - 1][m][1]) >= k;
}
int main() {
  mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
  cin.tie(0)->sync_with_stdio(0);
  cin >> n >> m >> k >> s;
  for (int i = s.size() - 1; i >= 0; --i) {
    lcp[i][i] = s.size() - i;
    for (int j = i + 1; j < s.size(); ++j) {
      if (s[i] == s[j]) {
        lcp[i][j] = lcp[j][i] = 1 + lcp[i + 1][j + 1];
      }
    }
  }
  for (int i = 0; i < n; ++i) {
    for (int j = i + 1; j <= s.size(); ++j) {
      vv.push_back({i, j});
    }
  }
  sort(vv.begin(), vv.end(), [](pair<int, int> a, pair<int, int> b) {
    int l = lcp[a.first][b.first];
    int l1 = a.second - a.first;
    int l2 = b.second - b.first;
    if (l1 > l) {
      if (l2 > l) {
        return s[a.first + l] < s[b.first + l];
      } else {
        return false;
      }
    } else {
      if (l2 > l) {
        return true;
      } else {
        return l1 < l2;
      }
    }
  });
  int l = 0;
  int r = vv.size() - 1;
  while (l < r) {
    int mid = (l + r + 1) >> 1;
    if (check(mid))
      l = mid;
    else
      r = mid - 1;
  }
  cout << (s.substr(vv[l].first, vv[l].second - vv[l].first)) << "\n";
  return 0;
}
