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 <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <cstdlib>
#define int long long
#define rep(i, n) for(i = 0; i < n; i++)
using namespace std;

int n, h;
string s;
int cnts[100001];		//cnts[i] = i桁(no leading 0)の数がいくつあるか. "0"や"00"は0桁としてカウント.
int begin_cnts[100001];

//spagetti-source, 動く形に書き直すのが難しかった()
struct SAComp {
  const int h, *g;
  SAComp(int h, int* g) : h(h), g(g) {}
  bool operator() (int a, int b) {
    return a == b ? false : g[a] != g[b] ? g[a] < g[b] : g[a+h] < g[b+h];
  }
};
vector<int> construct_sa(string s) {
  int n = s.length();
  int *g = new int[n+1];
  int *b = new int[n+1];
  int *v = new int[n+1];
  int i;
  rep(i,n+1) v[i] = i, g[i] = s[i];
  b[0] = 0; b[n] = 0;

  sort(v, v+n+1, SAComp(0, g));
  for(int h = 1; b[n] != n ; h *= 2) {
    SAComp comp(h, g);
    sort(v, v+n+1, comp);
    rep(i, n) b[i+1] = b[i] + comp(v[i], v[i+1]);
    rep(i, n+1) g[v[i]] = b[i];
  }
  delete[] g;
  delete[] b;
  
  vector<int> ret;
  rep(i, n + 1) ret.push_back(v[i]);
  delete[] v;
  return ret;
}

/*vector<int> construct_sa(string &s) {
	vector<string> vs;
	int i, j;
	
	rep(i, s.length() + 1) {
		string suf;
		for (j = i; j < s.length(); j++) suf += s[j];
		vs.push_back(suf);
	}
	sort(vs.begin(), vs.end());
	
	vector<int> sa;
	rep(i, vs.size()) sa.push_back(s.length() - vs[i].length());
	return sa;
}*/

signed main() {
	int i, j;
	
	cin >> n >> h >> s;
	
	j = 0;
	rep(i, n) {
		if (j < i) j = i;
		for (; j < n; j++) if (s[j] != '0') break;
		
		cnts[0] += j - i;
		cnts[1] -= j - i;
		cnts[1] += 1;
		cnts[n - j + 1] -= 1;
	}
	rep(i, n) cnts[i + 1] += cnts[i];
	
	int cnt = 0;
	rep(i, n + 1) {
		cnt += cnts[i];
		if (cnt >= h) break;
	}
	
	int keta = i;
	if (keta == 0) { cout << 0 << endl; return 0; }
	
	cnt = 0;
	rep(i, keta) { cnt += cnts[i]; }
	h = h - cnt;
	
	j = n - keta;
	for (i = n - keta; i >= 0; i--) {
		if (s[i] == '0') continue;
		if (j >= i) j = i - 1;
		for (; j >= 0; j--) if (s[j] != '0') break;
		begin_cnts[i] = i - j;
	}
	
	vector<int> sa = construct_sa(s);
	
	//rep(i, sa.size()) cout << "sa[" << i << "] = " << sa[i] << endl;
	
	rep(i, sa.size()) {
		if (sa[i] == s.length()) continue;	//空文字列
		if (s[sa[i]] == '0') continue;		//先頭が0のものは無視
		h -= begin_cnts[sa[i]];				//[0…0], s[sa[i]], …であって、桁数= ketaになるパターン数
		if (h <= 0) break;
	}
	
	int offset = sa[i];
	string ans;
	rep(i, keta) ans += s[offset + i];
	cout << ans << endl;
	return 0;
}
