#include <bits/stdc++.h>
using namespace std;
template <class t>
inline t read(t &x) {
  char c = getchar();
  bool f = 0;
  x = 0;
  while (!isdigit(c)) f |= c == '-', c = getchar();
  while (isdigit(c)) x = (x << 1) + (x << 3) + (c ^ 48), c = getchar();
  if (f) x = -x;
  return x;
}
template <class t>
inline void write(t x) {
  if (x < 0)
    putchar('-'), write(-x);
  else {
    if (x > 9) write(x / 10);
    putchar('0' + x % 10);
  }
}
const long long N = 1005;
string s;
vector<string> a;
long long ans, n, m, k, f[N][N], nxt[N], cf[N][N];
bool check(string t) {
  string s = " " + ::s;
  for (long long i = 0; i <= n; i++)
    for (long long j = 0; j <= m; j++) f[i][j] = cf[i][j] = 0;
  f[0][0] = 1;
  for (long long i = 1; i <= n; i++) {
    nxt[i] = n + 1;
    for (long long j = i; j <= n; j++)
      if (s.substr(i, j - i + 1) >= t) {
        nxt[i] = j;
        break;
      }
  }
  for (long long i = 0; i <= n; i++) {
    for (long long j = 0; j <= i && j <= m; j++) {
      if (i) cf[i][j] += cf[i - 1][j];
      if (cf[i][j] > k) cf[i][j] = k;
      f[i][j] += cf[i][j];
      if (f[i][j] > k) f[i][j] = k;
      if (nxt[i + 1] <= n) cf[nxt[i + 1]][j + 1] += f[i][j];
      if (cf[nxt[i + 1]][j + 1] > k) cf[nxt[i + 1]][j + 1] = k;
    }
  }
  return f[n][m] >= k;
}
signed main() {
  read(n);
  read(m);
  read(k);
  cin >> s;
  for (long long i = 0; i < n; i++)
    for (long long j = 1; j <= n; j++)
      if (i + j - 1 < n) a.push_back(s.substr(i, j));
  sort(a.begin(), a.end());
  long long l = 0, r = a.size() - 1;
  while (l <= r) {
    long long mid = l + r >> 1;
    if (check(a[mid]))
      ans = mid, l = mid + 1;
    else
      r = mid - 1;
  }
  cout << a[ans];
}
