/*
TASK:wac
LANG:C++
*/
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include "module.h"
#include <vector>

using namespace std;

#define MAXN 128
#define INF 100000000

typedef struct node {
    int ends;
    node *a[26];
    node *back;
    node() {
        ends = INF;
    }
};
typedef struct tel {
    int now;
    char szWord[32];
    char szNum[32];
};

char szTemp[128];
char szComm[10], szWord[32], szNum[32];
const char szAns[32][32] = {".", "alakazala", "alakazala", "alamazala", "alakazala", ".", "alabala"};

int best, gpos;
int ansbr;

vector <const char *> dict;
vector <tel> uk;

void add(const char *szWord, node *root) {
    dict.push_back(szWord);
    for (int i = 0; i < strlen(szWord); i++) {
        if (root->a[szWord[i]-'a'] != NULL) {
            root = root->a[szWord[i]-'a'];
        }
        else {
            node *n;
            n = (node *)malloc(sizeof(node));
            root->a[szWord[i]-'a'] = n;
            n->back = root;
            root = n;
        }
    }
    root->ends = dict.size()-1;
    return;
}

void DFS_find(node *root) {
    if (root->ends < best && root->ends >= gpos) {
        best = root->ends;
    }
    for (int i = 0; i < 26; i++) {
        if (root->a[i] != NULL) {
            DFS_find(root->a[i]);
        }
    }
    return;
}

int find(const char *szWord, int pos, node *root) {
    for (int i = 0; i < strlen(szWord); i++) {
        if (root->a[szWord[i]-'a'] == NULL) {
            return INF;
        }
        else {
            root = root->a[szWord[i]-'a'];
        }
    }
    best = INF;
    gpos = pos;
    DFS_find(root);
    return best;
}
int find_next(const char *szNum, node *root) {
    int i;
    for (i = 0; i < uk.size(); i++) {
        if (!strcmp(uk[i].szNum, szNum)) {
            return find(uk[i].szWord, uk[i].now+1, root);
        }
    }
    return INF;
}

int main() {
    init();
    
    node *root;
    
    root = (node *)malloc(sizeof(node));
    
    
    while (true) {
        getQuery(szTemp);
        sscanf(szTemp, "%s", szComm);
        if (strcmp(szComm, "ADD")) {
            answerQuery((char *)szAns[ansbr++]);
        }
    }
/*        sscanf(szTemp, "%s", szComm);
        if (!strcmp(szComm, "ADD")) {
            sscanf(szTemp, "%s%s", szComm, szWord);
            add(szWord, root);
        }
        else if (!strcmp(szComm, "FIRST")) {
            sscanf(szTemp, "%s%s%s", szComm, szNum, szWord);
            int ans = find(szWord, 0, root);
            answerQuery(".");
        }
        else {
            sscanf(szTemp, "%s%s", szComm, szNum);
            int ans = find_next(szNum, root);
            if (ans == INF) {
                answerQuery(".");
            }
            else {
                answerQuery((char*)dict[ans]);
                for (int i = 0; i < uk.size(); i++) {
                    if (!strcmp(uk[i].szNum, szNum)) {
                        uk[i].now = ans;
                    }
                }
            }
        }
    }*/
    //qjovec, k-put, eos`! pz!
    return 0;
}
