#include <bits/stdc++.h>
using namespace std;
uint64_t rnd_data = 0xDEADBEEFDULL;
inline void my_srand(int seed) { rnd_data = ((uint64_t)seed << 16) | 0x330E; }
inline int my_rand() {
  rnd_data = rnd_data * 0x5DEECE66DULL + 0xB;
  return (rnd_data >> 17) & 0x7FFFFFFF;
}
template <typename T>
void my_random_shuffle(T b, T e) {
  for (int i = (1); i <= (int)((int)(e - b) - 1); i++) {
    swap(b[i], b[my_rand() % (i + 1)]);
  }
}
template <class _T>
inline _T sqr(const _T &x) {
  return x * x;
}
template <typename type_t, typename less_t = std::less<type_t>>
inline bool uin(type_t &a, const type_t &b, const less_t &ls = less_t()) {
  return ls(b, a) ? a = b, true : false;
}
template <typename type_t, typename less_t = std::less<type_t>>
inline bool uax(type_t &a, const type_t &b, const less_t &ls = less_t()) {
  return ls(a, b) ? a = b, true : false;
}
const long double PI = 3.1415926535897932384626433832795L;
const long double EPS = 1e-9;
const long long INF = 1e18 + 1e16;
int n, m;
long long k;
string s;
int b[1024][1024];
pair<int, int> a[1024 * 1024];
long long d[1024][1024];
long long sd[1024];
bool cmp(pair<int, int> x, pair<int, int> y) {
  int l = b[x.first][y.first];
  uin(l, x.second);
  uin(l, y.second);
  int cx = l < x.second ? s[x.first + l] : 0;
  int cy = l < y.second ? s[y.first + l] : 0;
  return cx < cy;
}
inline void add(long long &a, long long b) {
  a += b;
  uin(a, INF);
}
long long calc(int q) {
  memset((d), 0, sizeof(d));
  d[0][n] = 1;
  pair<int, int> x = a[q];
  for (int p = 0; p < (int)(m); p++) {
    sd[n] = d[p][n];
    for (int i = (n)-1; i >= 0; i--) {
      sd[i] = d[p][i];
      add(sd[i], sd[i + 1]);
    }
    for (int i = (n)-1; i >= 0; i--) {
      pair<int, int> y = make_pair(i, n - i);
      int l = b[x.first][i];
      uin(l, x.second);
      int st;
      if (l == x.second) {
        st = i + l;
      } else {
        int cx = l < x.second ? s[x.first + l] : 0;
        int cy = l < y.second ? s[y.first + l] : 0;
        if (cx > cy) continue;
        st = i + l + 1;
      }
      add(d[p + 1][i], sd[st]);
    }
  }
  return d[m][0];
}
int main() {
  cin >> n >> m >> k;
  cin >> s;
  memset((b), 0, sizeof(b));
  int t = 0;
  for (int i = (n)-1; i >= 0; i--) {
    b[i][i] = n - i;
    for (int j = (n - 1); j >= (int)(i + 1); j--) {
      b[i][j] = b[j][i] = s[i] == s[j] ? b[i + 1][j + 1] + 1 : 0;
    }
  }
  for (int i = 0; i < (int)(n); i++) {
    for (int j = (i); j <= (int)(n - 1); j++) {
      a[t++] = make_pair(i, j - i + 1);
    }
  }
  sort(a, a + t, cmp);
  int tt = 1;
  for (int i = (1); i <= (int)(t - 1); i++) {
    if (cmp(a[tt - 1], a[i])) a[tt++] = a[i];
  }
  t = tt;
  int mi = 0;
  int ma = t - 1;
  while (mi < ma) {
    int q = (mi + ma + 1) / 2;
    if (calc(q) < k)
      ma = q - 1;
    else
      mi = q;
  }
  cout << s.substr(a[mi].first, a[mi].second) << endl;
  return 0;
}
