#include <bits/stdc++.h>
using namespace std;
class TaskC {
 public:
  vector<vector<int>> trie;
  vector<pair<int, int>> first;
  vector<vector<pair<int, int>>> next;
  void makeWalk(int root, vector<int> &walk) {
    walk.push_back(root);
    for (int c : trie[root]) {
      if (c >= 0) {
        makeWalk(c, walk);
      }
    }
  }
  void solveOne(istream &in, ostream &out) {
    int n;
    int m;
    long long k;
    in >> n >> m >> k;
    string s;
    in >> s;
    trie.clear();
    first.clear();
    next.clear();
    next.resize(n, vector<pair<int, int>>(n));
    int root = 0;
    trie.emplace_back(26, -1);
    first.emplace_back(-1, -1);
    for (int start = 0; start < n; ++start) {
      int at = root;
      for (int finish = start; finish < n; ++finish) {
        int c = s[finish] - 'a';
        if (trie[at][c] < 0) {
          int nxt = trie.size();
          trie[at][c] = nxt;
          trie.emplace_back(26, -1);
          first.emplace_back(-1, -1);
        }
        at = trie[at][c];
        next[start][finish] = first[at];
        first[at] = {start, finish};
      }
    }
    vector<int> walk;
    vector<int> vmin;
    vector<int> vmax;
    vector<int> vcnt;
    makeWalk(0, walk);
    int left = 0;
    int right = walk.size();
    vector<vector<long long>> waysSum(n + 1, vector<long long>(m + 1, 0));
    while (right - left > 1) {
      int middle = (left + right) / 2;
      vmin.clear();
      vmin.resize(n, n);
      vmax.clear();
      vmax.resize(n, -1);
      vcnt.clear();
      vcnt.resize(n, 0);
      for (int i = middle; i < walk.size(); ++i) {
        pair<int, int> cur = first[walk[i]];
        while (cur.first >= 0) {
          vmin[cur.first] = min(vmin[cur.first], cur.second);
          vmax[cur.first] = max(vmax[cur.first], cur.second);
          ++vcnt[cur.first];
          cur = next[cur.first][cur.second];
        }
      }
      for (int i = 0; i <= n; ++i) {
        for (int j = 0; j <= m; ++j) {
          waysSum[i][j] = 0;
        }
      }
      waysSum[n][0] = 1;
      for (int i = n - 1; i >= 0; --i) {
        if (vcnt[i] > 0) {
          assert(vcnt[i] == vmax[i] - vmin[i] + 1);
          assert(vmax[i] == n - 1);
          for (int j = 1; j <= m; ++j) {
            waysSum[i][j] = waysSum[vmin[i] + 1][j - 1];
          }
        }
        if (i > 0) {
          for (int j = 0; j <= m; ++j) {
            waysSum[i][j] += waysSum[i + 1][j];
            if (waysSum[i][j] >= k) {
              waysSum[i][j] = k;
            }
          }
        }
      }
      long long got = waysSum[0][m];
      if (got >= k) {
        left = middle;
      } else {
        right = middle;
      }
    }
    pair<int, int> res = first[walk[left]];
    out << s.substr(res.first, res.second - res.first + 1) << "\n";
  }
  void solve(std::istream &in, std::ostream &out) {
    int nt;
    nt = 1;
    for (int it = 0; it < nt; ++it) {
      solveOne(in, out);
    }
  }
};
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  TaskC solver;
  std::istream &in(std::cin);
  std::ostream &out(std::cout);
  solver.solve(in, out);
  return 0;
}
