#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=5e5+7;
struct state{
int len,nxt[30],link;
}trie[N<<1];
int tot,lst;
long long f[N<<1],cnt[N<<1];
string s;
int t,k;
vector<int>g[N<<1];
inline void init(){
trie[0].len=0;
trie[0].link=-1;
tot++;
lst=0;
}
void extend(char c){
int id=c-'a';
int cur=++tot,p=lst;
trie[cur].len=trie[lst].len+1;
cnt[cur]=1;
while(p!=-1&&!trie[p].nxt[id]){
trie[p].nxt[id]=cur;
p=trie[p].link;
}
if(p==-1){
trie[cur].link=0;
}else{
int q=trie[p].nxt[id];
if(trie[q].len==trie[p].len+1){
trie[cur].link=q;
}else{
int np=++tot;
trie[np].len=trie[p].len+1;
trie[np].link=trie[q].link;
for(int i=0;i<26;i++){
trie[np].nxt[i]=trie[q].nxt[i];
}
while(p!=-1&&trie[p].nxt[id]==q){
trie[p].nxt[id]=np;
p=trie[p].link;
}
trie[q].link=trie[cur].link=np;
}
}
lst=cur;
}
void dfs1(int u){
for(int i=0;i<g[u].size();i++){
int v=g[u][i];
dfs1(v);
cnt[u]+=cnt[v];
}
}
int vis[N<<1];
int dfs2(int u){
if(vis[u]){
return f[u];
}
vis[u]=1;
f[u]=cnt[u];
for(int i=0;i<26;i++){
int v=trie[u].nxt[i];
if(v){
f[u]+=dfs2(v);
}
}
return f[u];
}
void query(int u,int k){
if(k>f[u]){
cout<<-1<<'\n';
return;
}
if(k<=cnt[u]){
return;
}
k-=cnt[u];
for(int i=0;i<26;i++){
int v=trie[u].nxt[i];
if(k>f[v]){
k-=f[v];
}else{
putchar('a'+i);
query(v,k);
return;
}
}
}
signed main(){
ios::sync_with_stdio(false);
cin>>s;
cin>>t>>k;
init();
for(int i=0;i<s.size();i++){
extend(s[i]);
}
for(int i=1;i<=tot;i++){
g[trie[i].link].push_back(i);
}
if(!t){
for(int i=0;i<=tot;i++){
cnt[i]=1;
}
}else{
dfs1(0);
}
cnt[0]=f[0]=0;
dfs2(0);
query(0,k);
return 0;
}