#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 3000011;
char str[N];
ll f[N],sz[N];
int t,k;
struct SAM{
int ch[28],len,fa;
}s[N];
int first[N],idx;
struct edge{
int ne,d;
}ed[N];
void add_edge(int e,int d){
idx++,ed[idx].d=d,ed[idx].ne=first[e],first[e]=idx;
}
int tot=1,lst=1;
void insert(int x){
int p,np;
p=lst,np=lst=++tot;
s[np].len=s[p].len+1;
sz[lst]=f[lst]=1;
for(;p&&!s[p].ch[x];p=s[p].fa) s[p].ch[x]=np;
if(!p) s[np].fa=1;
else{
int q=s[p].ch[x];
if(s[q].len==s[p].len+1) s[np].fa=q;
else{
int nq=++tot;
s[nq]=s[q];
s[nq].len=s[p].len+1;
s[q].fa=s[np].fa=nq;
for(;p&&s[p].ch[x]==q;p=s[p].fa) s[p].ch[x]=nq;
}
}
}
void dfs1(int x){
for(int i=first[x];i;i=ed[i].ne){
int d=ed[i].d;
if(!d) continue;
dfs1(d);
sz[x]+=sz[d];
}
f[x]=sz[x];
}
bool vis[N];
ll dfs2(int x){
if(vis[x]) return f[x];
vis[x]=true;
for(int i=0;i<26;i++){
int d=s[x].ch[i];
if(d) f[x]+=dfs2(d);
}
return f[x];
}
void print(int x,int k){
if(k>f[k]){
puts("-1");
return ;
}
if(k<=sz[x]) return ;
k-=sz[x];
for(int i=0;i<26;i++){
int d=s[x].ch[i];
// cout<<d<<k<<f[d];
if(k>f[d]) k-=f[d];
else{
printf("%c",'a'+i);
print(d,k);
return ;
}
}
}
int main()
{
scanf("%s",str+1);
int len=strlen(str+1);
for(int i=1;i<=len;i++) insert(str[i]-'a');
for(int i=1;i<=tot;i++) if(s[i].fa) add_edge(s[i].fa,i);//注意判断条件
cin>>t>>k;
if(!t) for(int i=1;i<=tot;i++) sz[i]=f[i]=1;
else dfs1(1);
f[1]=sz[1]=0;
dfs2(1);
print(1,k);
return 0;
}