//SPOJ SUBLEX - Lexicographical Substring Search
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <queue>
#include <cstring>
#define LL long long
#define Lowbit(X) (X&(-X))
#define Lson (X<<1)
#define Rson (X<<1|1)
#define Cl(X,Y) memset((X),(Y),sizeof(X))
#define FOR(i,A,B) for(LL i=A;i<=B;i++)
#define BOR(i,A,B) for(LL i=A;i>=B;i--)
#define FOR_SIDE(i,A) for(LL i=Head[A];i;i=Next[i])
#define INF 0x7fffffff
using namespace std;
const int MAXN=1e5+10;
int Size,u,v,w,DP[MAXN<<1],Last,Test,Temp;
struct Node {
int Link,Ch[30];
int Len;
}State[MAXN<<1];
char Num[MAXN];
int Next[MAXN<<2],End[MAXN<<2],Side,Head[MAXN<<1],Val[MAXN<<2];
int RNext[MAXN<<2],REnd[MAXN<<2],RSide,RHead[MAXN<<1];
int CD[MAXN<<1];
queue<int>Mine;
inline void File() {
freopen(".in","r",stdin);
freopen(".out","w",stdout);
}
inline void Update(int New) {
int Cur=++Size;
State[Cur].Len=State[Last].Len+1;
int Loc=Last;
while(Loc!=-1 && !State[Loc].Ch[New]) {
State[Loc].Ch[New]=Cur;
Loc=State[Loc].Link;
}
if(Loc==-1) State[Cur].Link=0;
else {
int To=State[Loc].Ch[New];
if(State[To].Len==State[Loc].Len+1) { State[Cur].Link=To; }
else {
int Clone=++Size;
State[Clone].Len=State[Loc].Len+1;
FOR(i,1,26) State[Clone].Ch[i]=State[To].Ch[i];
State[Clone].Link=State[To].Link;
while(Loc!=-1 && State[Loc].Ch[New]==To) {
State[Loc].Ch[New]=Clone;
Loc=State[Loc].Link;
}
State[To].Link=State[Cur].Link=Clone;
}
}
Last=Cur;
}
inline void Add_Edge(int From,int To,int Res) {
Next[++Side]=Head[From];
Head[From]=Side;
End[Side]=To;
Val[Side]=Res;
CD[From]++;
RNext[++RSide]=RHead[To];
RHead[To]=RSide;
REnd[RSide]=From;
}
inline void Topo() {
FOR(i,1,Size) if(!CD[i]) Mine.push(i);
while(!Mine.empty()) {
int New=Mine.front();
DP[New]+=1;
Mine.pop();
for(int i=RHead[New];i;i=RNext[i]) {
DP[REnd[i]]+=DP[New];
if(!(--CD[REnd[i]])) Mine.push(REnd[i]);
}
}
}
inline void Query(int New,int Rank) {
if(!Rank) { return; }
FOR_SIDE(i,New) {
if(DP[End[i]]<Rank) Rank-=DP[End[i]];
else {
printf("%c",(char)(Val[i]+'a'-1));
Query(End[i],Rank-1);
return;
}
}
}
inline void Get(int Rank) {
if(Rank>=DP[0]) printf("-1\n");
else Query(0,Rank);
}
inline void DFS(int New) {
BOR(i,26,1) {
if(!State[New].Ch[i]) continue;
Add_Edge(New,State[New].Ch[i],i);
DFS(State[New].Ch[i]);
}
}
int main() {
//File();
scanf("%s",Num+1); Temp=strlen(Num+1);
State[0].Link=-1;
FOR(i,1,Temp) { Update(Num[i]-'a'+1); }
DFS(0);
Topo();
scanf("%d",&Test);
while(Test--) {
scanf("%d",&u);
Get(u);
printf("\n");
}
//fclose(stdin); fclose(stdout);
system("pause");
return 0;
}