// 基本原理就是dfs模板往上套,运行时间也是真的长,暴力枚举我只会到这里
// 不过真的很好理解,就是用dfs枚举,然后当构造出来之后就把flag标记为true

bool flag = false;  // 是否构造出来
/*如果构造出来的话,所有栈帧的函数全部销毁*/
void dfs(int cnt,string s1,string &res,string ha)
{
    if (flag)return ;
    if (cnt == enc_len)
    {
        if (H(s1) == ha)
        {
            res = s1;
            flag = true;
        }
        return;
    }
    for (char c = 'b';c <= 'z';c++)
    {
        s1.push_back(c);
        dfs(cnt+1,s1,res,ha);
        s1.pop_back();
    }
}
pair<string, string> solve() {  
    // enc_len是原始字符串长度,enc_key是密钥key
    string s1 = "",s2 = "";
    for (int i = 0;i < enc_len;i++)s1.push_back('a');
    string ha = H(s1);
    dfs(0,"",s2,ha);
    return {s1,s2};
}

int main() {
    cin >> enc_len >> enc_key;
    auto result = solve();
    cout << result.first << " " << result.second << endl;
    return 0;
}