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 _MACRO(_1, _2, _3, NAME, ...) NAME
#define _repl(i,a,b) for(int i=(int)(a);i<(int)(b);i++)
#define _rep(i,n) _repl(i,0,n)
#define rep(...) _MACRO(__VA_ARGS__, _repl, _rep)(__VA_ARGS__)
#define mp make_pair
#define pb push_back
#define all(x) begin(x),end(x)
#define uniq(x) sort(all(x)),(x).erase(unique(all(x)),end(x))
#define fi first
#define se second
#define dbg(...) _dbg(#__VA_ARGS__, __VA_ARGS__)
void _dbg(string){cerr<<endl;}
template<class H,class... T> void _dbg(string s,H h,T... t){int l=s.find(',');cerr<<s.substr(0,l)<<" = "<<h<<", ";_dbg(s.substr(l+1),t...);}
template<class T,class U> ostream& operator<<(ostream &o, const pair<T,U> &p){o<<"("<<p.fi<<","<<p.se<<")";return o;}
template<class T> ostream& operator<<(ostream &o, const vector<T> &v){o<<"[";for(T t:v){o<<t<<",";}o<<"]";return o;}

typedef long long ll;
typedef pair<int,int> P;

class SuffixArray {
public:
  const string &s;
  vector<int> sa, rank;
  int n;
  void construct_sa(){
    sa.resize(n+1);
    rank.resize(n+1);
    rep(i,n+1){
      sa[i]=i;
      rank[i] = (i<n)?s[i]:(-1);
    }
    vector<int> tmp(n+1,0);
    for(int k=1; k<=n; k*=2){
      auto comp = [&](const int i, const int j){
        if(rank[i]!=rank[j]) return rank[i]<rank[j];
        int ri = (i+k<=n)?(rank[i+k]):-1;
        int rj = (j+k<=n)?(rank[j+k]):-1;
        return ri < rj;
      };
      sort(all(sa), comp);
      tmp[sa[0]]=0;
      rep(i,1,n+1){
        tmp[sa[i]] = tmp[sa[i-1]];
        if(comp(sa[i-1], sa[i])) tmp[sa[i]]++;
      }
      swap(tmp, rank);
    }
  }
  SuffixArray(const string &str) : s(str){
    n = s.size();
    construct_sa();
  }
};


void solve(int n, ll h, string &str, int len){
  if(len == 0){
    cout << "0" << endl;
    return;
  }

  SuffixArray sa(str);
  vector<int> arr(n+1,0);
  rep(i,1,n+1) if(str[sa.sa[i]]>'0'){
    int idx = sa.sa[i];
    int d = 1;
    if(n-idx < len) d = 0;
    else {
      while(idx-d>=0 && str[idx-d]=='0') d++;
    }
    arr[i] = arr[i-1] + d;
    if(arr[i] >= h){
      cout << str.substr(idx, len) << endl;
      return;
    }
  }
  assert(false);
}

int main(void){
	int n;
	ll h;
	string str;
	scanf("%d%lld",&n,&h);
	cin >> str;
	int z=-1;
	vector<int> nonzero(n+1);
	vector<ll> cnt(n+1);
	for(int i=0;i<=n;i++){
		cnt[i]=0;
	}
	for(int i=n-1;i>=0;i--){
		if(str[i]>='1'){
			z=i;
		}
		nonzero[i]=z;
	}
	for(int i=0;i<n;i++){
		//printf("%d\n",nonzero[i]);
		if(nonzero[i]==-1)continue;
		cnt[n-nonzero[i]]++;
	}
	for(int i=n;i>1;i--){
		cnt[i-1]+=cnt[i];
	}
	ll len=0;
	for(int i=0;i<n;i++){
		if(str[i]=='0'){
			len++;
		}else{
			cnt[0]+=len*(len+1)/2LL;
			len=0;
		}
	}
	cnt[0]+=len*(len+1)/2LL;
	ll sum=0;
	for(int i=0;i<=n;i++){
		sum+=cnt[i];
		if(sum>=h){
			sum-=cnt[i];
			solve(n,h-sum,str,i);
			return 0;
		}
	}
	return 0;
}

