Problem

There is a string $ S $ of length $ N $. All characters in $ S $ are numbers between 0 and 9.
When you make a sequence of $ \ frac {N \ times (N + 1)} {2} $, which is the number of terms created by enumerating all the numbers created from all the substrings of $ S $, Find the smallest value in $ H $.

Constraints

The input satisfies the following conditions.

* $ 1 \ leq N \ leq 10 ^ 5 $
* $ 1 \ leq H \ leq \ frac {N \ times (N + 1)} {2} $
* $ | S | = N $
* All characters in $ S $ are 0, 1, 2, 3, 4, 5, 6, 7, 8, 9

Input

The input is given in the following format.


$ N $ $ H $
$ S $


All inputs are given as integers.
$ N $ and $ H $ are given on the first line, separated by blanks.
The second line is given the string $ S $ of length $ N $.

Output

Output the $ H $ th value on one line.
(Do not include extra 0s at the beginning of the output.)

Examples

Input

2 3
00


Output

0


Input

4 9
0012


Output

12


Input

5 13
10031


Output

100
#include "bits/stdc++.h"
using namespace std;
#define rep(i,n) for (int i=0;i<(n);i++)
#define rep2(i,a,b) for (int i=(a);i<(b);i++)

using ll = long long;
using Pll = pair<ll, ll>;

class SuffixArray {
private:
    string s;
    int n;
    vector<int> rank;
    vector<int> sa;
public:
    SuffixArray(string _s) : s(_s) {
        n = s.size();
        rank.resize(n + 1);
        sa.resize(n + 1);
        construct();
    }
    vector<int> construct() {
        for (int i = 0; i <= n; ++i) {
            sa[i] = i;
            rank[i] = i < n ? s[i] : -1;
        }

        int k;
        auto compare = [&](int i, int j) {
            if (rank[i] != rank[j]) return rank[i] < rank[j];
            else {
                int ri = i + k <= n ? rank[i + k] : -1;
                int rj = j + k <= n ? rank[j + k] : -1;
                return ri < rj;
            }
        };

        vector<int> tmp(n + 1);
        for (k = 1; k <= n; k *= 2) {
            sort(sa.begin(), sa.end(), compare);

            tmp[sa[0]] = 0;
            for (int i = 1; i <= n; ++i) {
                tmp[sa[i]] = tmp[sa[i - 1]] + (compare(sa[i - 1], sa[i]) ? 1 : 0);
            }
            for (int i = 0; i <= n; ++i) {
                rank[i] = tmp[i];
            }
        }
        return sa;
    }
};

int main() {
  std::ios::sync_with_stdio(false);
  std::cin.tie(0);

  int n;
  ll k;
  cin >> n >> k;
  string s;
  cin >> s;
  vector<ll> lead(n + 1); // leading zero
  rep2(i, 1, n + 1) {
    if (s[i - 1] == '0') {
      lead[i] = lead[i - 1] + 1;
    }
  }

  ll num_zero = accumulate(lead.begin(), lead.end(), 0ll);
  k -= num_zero;
  if (k <= 0) {
    cout << 0 << endl;
    return 0;
  }

  auto f = [&](ll m) {
    ll a = 0;
    rep(i, n) {
      if (s[i] != '0') {
        a += (lead[i] + 1) * min<ll>(n - i, m);
      }
    }
    return a;
  };

  ll l = 0, r = n;
  while (r - l > 1) {
    ll m = (l + r) / 2;
    if (k <= f(m)) r = m;
    else l = m;
  }

  ll len = r;
  ll kk = k - f(len - 1);
  SuffixArray suf(s);
  vector<int> sa = suf.construct();
  rep2(i, 1, sa.size()) {
    if (sa[i] == n || s[sa[i]] == '0' || n - sa[i] < len) continue;
    int num = lead[sa[i]] + 1;
    kk -= num;
    if (kk <= 0) {
      cout << s.substr(sa[i], len) << endl;
      return 0;
    }
  }
}

