#include<stdio.h>
#include<map>
struct{
int fail,len,cnt;
std::map<char,int>ch;
}node[1000000];
int tot,last,sum[1000000];
inline void init(){node[last=0].fail=-1,node[0].len=0,tot=1;}
inline void insert(char c){
int p=last,cur=tot++;
for(node[cur].len=node[p].len+1,node[cur].cnt=1;(~p)&&!node[p].ch[c];p=node[p].fail)node[p].ch[c]=cur;
if(~p){
int q=node[p].ch[c];
if(node[p].len+1==node[q].len)node[cur].fail=q;
else{
int clone=tot++;
node[clone]={node[q].fail,node[p].len+1,0,node[q].ch},node[q].fail=node[cur].fail=clone;
for(;(~p)&&node[p].ch[c]==q;p=node[p].fail)node[p].ch[c]=clone;
}
}else node[cur].fail=0;
last=cur;
}
void topo(){
static int q[1000000],deg[1000000];
int l=0,r=0;
for(int i=1;i<tot;++i)++deg[node[i].fail];
for(int i=0;i<tot;++i)if(!deg[i])q[r++]=i;
for(;l<r;++l)
if(!(node[node[q[l]].fail].cnt+=node[q[l]].cnt,--deg[node[q[l]].fail]))
q[r++]=node[q[l]].fail;
node[0].cnt=0;
}
void dfs(int u){
sum[u]=node[u].cnt;
for(const auto&v:node[u].ch)
dfs(v.second),sum[u]+=sum[v.second];
}
void print(int u,int k){
if(k<=node[u].cnt)return;
k-=node[u].cnt;
for(const auto&v:node[u].ch){
if(k<=sum[v.second])return putchar(v.first),print(v.second,k);
k-=sum[v.second];
}
}
int main(){
init();
for(char c=getchar();'a'<=c&&c<='z';c=getchar())insert(c);
int type,k;
scanf("%d%d",&type,&k);
if(type)topo();
else for(int i=1;i<tot;++i)node[i].cnt=1;
dfs(0);
if(k>sum[0])puts("-1");
else print(0,k);
return 0;
}