#include<bits/stdc++.h>
using namespace std;
int query(string q);
int n, s;
namespace sub12{
string solve(){
string ans = "";
for(int i = 0, bef = 0; i < n; i++){
for(int j = 0; j <= i; j++){
for(int k = 0; k < s; k++){
string candidate = "";
for(int t = 0; t < j; t++){
candidate += ans[t];
}
candidate += char('a' + k);
for(int t = j; t < i; t++){
candidate += ans[t];
}
if(query(candidate) > bef){
bef++;
ans = candidate;
j = i;
break;
}
}
}
}
return ans;
}
}
namespace sub34{
string solve(){
vector<int>cnt(s), ord(s);
for(int i = 0; i + 1 < s; i++){
cnt[ord[i] = i] = query(string(n, 'a' + i));
}
cnt[ord[s - 1] = s - 1] = n - accumulate(cnt.begin(), prev(cnt.end()), 0);
sort(ord.begin(), ord.end(), [&] (int i, int j){
return cnt[i] < cnt[j];
});
string ans = "";
for(int& c : ord){
vector<int>f(ans.size(), 0);
for(int p = 0; p < ans.size() && cnt[c] > 0; p++){
f[p] = cnt[c];
for(int k = 1, exp = ans.size(); k <= cnt[c]; k++){
string temp = ans.substr(0, p) + string(k, 'a' + c) + ans.substr(p, int(ans.size()) - p);
if(query(temp) != ++exp){
f[p] = k - 1;
break;
}
}
cnt[c] -= f[p];
}
string nans = "";
for(int p = 0; p < ans.size(); nans += ans[p++]){
nans += string(f[p], 'a' + c);
}
swap(ans, nans);
ans += string(cnt[c], 'a' + c);
}
return ans;
}
}
namespace sub5{
vector<int>cnt, ord;
string small_solve(vector<int>ord){
string ans = "";
for(int& c : ord){
vector<int>f(ans.size(), 0);
for(int p = 0; p < ans.size() && cnt[c] > 0; p++){
f[p] = cnt[c];
for(int k = 1, exp = ans.size(); k <= cnt[c]; k++){
string temp = ans.substr(0, p) + string(k, 'a' + c) + ans.substr(p, int(ans.size()) - p);
if(query(temp) != ++exp){
f[p] = k - 1;
break;
}
}
cnt[c] -= f[p];
}
string nans = "";
for(int p = 0; p < ans.size(); nans += ans[p++]){
nans += string(f[p], 'a' + c);
}
swap(ans, nans);
ans += string(cnt[c], 'a' + c);
}
return ans;
}
string solve(){
cnt.resize(s);
ord.resize(s);
for(int i = 0; i + 1 < s; i++){
cnt[ord[i] = i] = query(string(n, 'a' + i));
}
cnt[ord[s - 1] = s - 1] = n - accumulate(cnt.begin(), prev(cnt.end()), 0);
sort(ord.begin(), ord.end(), [&] (int i, int j){
return cnt[i] < cnt[j];
});
vector<int>part;
for(int i = 0; i < s; i += 2){
part.push_back(ord[i]);
}
string ans = small_solve(part);
part.clear();
for(int i = 1; i < s; i += 2){
part.push_back(ord[i]);
}
string other = small_solve(part);
int i = 0;
for(int p = 0; p < ans.size(); p++){
for(; i < other.size(); i++, p++){
string next_ans = ans.substr(0, p) + other[i] + ans.substr(p, int(ans.size()) - p);
if(query(next_ans) != next_ans.size()){
break;
}
swap(ans, next_ans);
}
}
while(i < other.size()){
ans += other[i++];
}
return ans;
}
}
string guess(int _n, int _s){
if((n = _n) <= (s = _s) || (n <= 100 && s <= 4)){
return sub12::solve();
}
if(n <= 3500){
return sub34::solve();
}
return sub5::solve();
}