#include <stdio.h>
#include <math.h>
#include <stdbool.h>
#define MAXSIZE 200
typedef int ElemType;
// 计算字符串长度:
int Length(char a[]) {
    int n = 0;
    for (int i = 0; a[i] != '\0'; i++) {
        n++;
    }
    return n;
}
typedef struct {
    ElemType data[MAXSIZE];
    int top;
} Stack_int;
// 初始化一个数字栈:
void InitStack(Stack_int* S) {
    S->top = -1;
}
// 进栈:
bool Push(Stack_int* S, ElemType x) {
    if (S->top == MAXSIZE - 1)
        return false;
    else {
        S->data[++S->top] = x;
        return true;
    }
}
// 出栈:
bool Pop(Stack_int* S, ElemType* x) {
    if (S->top != -1) {
        *x = S->data[S->top--];
        return true;
    } else
        return false;
}
int main() {
    int a, b;
    char c[10] = "";
    scanf("%d %s %d", &a, c, &b);
    int len = Length(c);
    long n = 0;
    int k = 0;
    for (int i = len - 1; i >= 0; i--) {
        if (c[i] >= 'a' && c[i] <= 'f') {
            int num = c[i] - 'a' + 10;
            n += num * pow(a, k);
            k++;
        } else if (c[i] >= 'A' && c[i] <= 'F') {
            int num = c[i] - 'A' + 10;
            n += num * pow(a, k);
            k++;
        } else {
            int num = c[i] - '0';
            n += num * pow(a, k);
            k++;
        }
    }
    Stack_int S;
    InitStack(&S);
    while (n != 0) {
        int x = n % b;
        n /= b;
        Push(&S, x);
    }
    while (S.top != -1) {
        int y;
        Pop(&S, &y);
        if (y >= 10)
            printf("%c", 'A' + (y - 10));
        else
            printf("%c", '0' + y);
    }
    printf("\n");
    return 0;
}