#include <stdio.h>
#include <vector>
#include<string>
#include <math.h>
#include <unordered_map>
//最大涉及36进制的转换!
using namespace std;
int main() {
    unordered_map<char, int> MapIn = { //便于处理输入数据
        {'A', 10}, {'B', 11}, {'C', 12},
        {'D', 13}, {'E', 14}, {'F', 15},
        {'G', 16}, {'H', 17}, {'I', 18},
        {'J', 19}, {'K', 20}, {'L', 21},
        {'M', 22}, {'N', 23}, {'O', 24},
        {'P', 25}, {'Q', 26}, {'R', 27},
        {'S', 28}, {'T', 29}, {'U', 30},
        {'V', 31}, {'W', 32}, {'X', 33},
        {'Y', 34}, {'Z', 35}
    };
    unordered_map<int, char> MapPut = { //便于处理输出数据
        {10, 'a'}, {11, 'b'}, {12, 'c'},
        {13, 'd'}, {14, 'e'}, {15, 'f'},
        {16, 'g'}, {17, 'h'}, {18, 'i'},
        {19, 'j'}, {20, 'k'}, {21, 'l'},
        {22, 'm'}, {23, 'n'}, {24, '0'},
        {25, 'p'}, {26, 'q'}, {27, 'r'},
        {28, 's'}, {29, 't'}, {30, 'u'},
        {31, 'v'}, {32, 'w'}, {33, 'x'},
        {34, 'y'}, {35, 'z'}
    };
    int m, n;
    scanf("%d%d", &m, &n);
    char x[30];
    scanf("%s", x);
    unsigned long long res = 0;
    string s = x;
    //注意将输入的字母进行处理成数(一边遍历一边处理无需存储对应的数)
    for (int i = 0 ; i < s.size() ;
            i++) { //将m进制的数x统一先转为十进制数
        if (s[s.size() - 1 - i] >= '0' && s[s.size() - 1 - i] <= '9') {
            res += (s[s.size() - 1 - i] - '0') * pow(m, i);//字符转为int类型
        } else { //注意:字符串中的字符作为下标(键)
            res += (MapIn[s[s.size() - 1 - i]]) * pow(m, i);
        }
    }
    vector<int> goal; //存储n进制的每一位数
    //再将十进制数res转为n进制
    if ( n == 10 ) { //如果最终要转换的进制数为10进制直接进行输出
        printf("%lld", res);
    } else {
        while ( res != 0) { //求解 n进制的每一数从低到高存入目标数组
            goal.push_back(res % n);
            res = res / n;
        }
        for (int i = goal.size() - 1; i >= 0 ; i--) { //反向输出
            if ( goal[i] >= 10 && goal[i] <= 35) { //10-35输出字母
                printf("%c", MapPut[goal[i]]);
            } else {
                printf("%d", goal[i]); //0-9输出数字
            }
        }
    }
    printf("\n");
    return 0;
}