#include <bits/stdc++.h>
using namespace std;
template <typename A, typename B>
string to_string(pair<A, B> p);
template <typename A, typename B, typename C>
string to_string(tuple<A, B, C> p);
template <typename A, typename B, typename C, typename D>
string to_string(tuple<A, B, C, D> p);
string to_string(const string& s) { return '"' + s + '"'; }
string to_string(const char* s) { return to_string((string)s); }
string to_string(bool b) { return (b ? "true" : "false"); }
string to_string(vector<bool> v) {
  bool first = true;
  string res = "{";
  for (long long i = 0; i < static_cast<long long>(v.size()); i++) {
    if (!first) {
      res += ", ";
    }
    first = false;
    res += to_string(v[i]);
  }
  res += "}";
  return res;
}
template <size_t N>
string to_string(bitset<N> v) {
  string res = "";
  for (size_t i = 0; i < N; i++) {
    res += static_cast<char>('0' + v[i]);
  }
  return res;
}
template <typename A>
string to_string(A v) {
  bool first = true;
  string res = "{";
  for (const auto& x : v) {
    if (!first) {
      res += ", ";
    }
    first = false;
    res += to_string(x);
  }
  res += "}";
  return res;
}
template <typename A, typename B>
string to_string(pair<A, B> p) {
  return "(" + to_string(p.first) + ", " + to_string(p.second) + ")";
}
template <typename A, typename B, typename C>
string to_string(tuple<A, B, C> p) {
  return "(" + to_string(get<0>(p)) + ", " + to_string(get<1>(p)) + ", " +
         to_string(get<2>(p)) + ")";
}
template <typename A, typename B, typename C, typename D>
string to_string(tuple<A, B, C, D> p) {
  return "(" + to_string(get<0>(p)) + ", " + to_string(get<1>(p)) + ", " +
         to_string(get<2>(p)) + ", " + to_string(get<3>(p)) + ")";
}
void debug_out() { cerr << endl; }
template <typename Head, typename... Tail>
void debug_out(Head H, Tail... T) {
  cerr << " " << to_string(H);
  debug_out(T...);
}
using ll = long long;
const long long MAXN = 1005;
char s[MAXN];
vector<pair<long long, long long>> ord;
long long n, m, lcp[MAXN][MAXN];
ll k, dp[MAXN][MAXN];
bool check(long long first) {
  memset(dp, 0, sizeof(dp));
  vector<long long> to(n + 1);
  for (long long i = 0; i <= n; i++) to[i] = i + 1;
  for (long long i = first; i < ((long long)ord.size()); i++) {
    to[ord[i].first - 1] = max(to[ord[i].first - 1], ord[i].second + 1);
  }
  dp[0][0] = 1;
  for (long long j = 0; j <= m; j++) {
    if (j)
      for (long long i = 1; i <= n; i++) {
        dp[i][j] += dp[i - 1][j];
        if (dp[i][j] > k) dp[i][j] = k;
      }
    for (long long i = j; i <= n; i++) {
      if (to[i] <= n) {
        dp[to[i]][j + 1] += dp[i][j];
        if (dp[to[i]][j + 1] > k) {
          dp[to[i]][j + 1] = k;
        }
      }
    }
  }
  return dp[n][m] < k;
}
void my_main() {
  cin >> n >> m >> k;
  cin >> (s + 1);
  for (long long i = 1; i <= n; i++) {
    for (long long j = i; j <= n; j++) {
      ord.push_back({i, j});
    }
  }
  for (long long i = n; i >= 1; i--) {
    for (long long j = n; j >= 1; j--) {
      if (i == j)
        lcp[i][j] = n - i + 1;
      else {
        if (s[i] == s[j])
          lcp[i][j] = lcp[i + 1][j + 1] + 1;
        else
          lcp[i][j] = 0;
      }
    }
  }
  sort(ord.begin(), ord.end(),
       [&](const pair<long long, long long>& a,
           const pair<long long, long long>& b) {
         long long len1 = a.second - a.first + 1;
         long long len2 = b.second - b.first + 1;
         if (lcp[a.first][b.first] >= min(len1, len2)) {
           if (len1 == len2) return false;
           return len1 == min(len1, len2);
         } else {
           return s[a.first + lcp[a.first][b.first]] <
                  s[b.first + lcp[a.first][b.first]];
         }
       });
  reverse(ord.begin(), ord.end());
  long long l = 0, r = ((long long)ord.size()) - 1;
  while (r - l > 1) {
    long long mid = (l + r) / 2;
    if (check(mid)) {
      l = mid;
    } else {
      r = mid;
    }
  }
  long long ans_l, ans_r;
  if (check(r))
    ans_l = ord[r].first, ans_r = ord[r].second;
  else
    ans_l = ord[l].first, ans_r = ord[l].second;
  for (long long i = ans_l; i <= ans_r; i++) {
    cout << s[i];
  }
  cout << endl;
}
signed main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout << fixed << setprecision(12);
  my_main();
  return 0;
}
