#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void addint(char str1[], char str2[]) {
    int n1 = strlen(str1);
    int n2 = strlen(str2);
    int flag = n1>n2;
    int n_max = flag?n1:n2;
    int n_min = flag?n2:n1;
    int int1[n_max];
    int int2[n_max];
    if(flag)
    {
        memset(int2, 0, sizeof(int2));                 //初始化数组置零
    }else {
        memset(int1, 0, sizeof(int1));
    }
    for(int i=0;i<n1;i++) int1[i] = str1[n1-1-i]-'0';   //将字符串转换为整形并倒置顺序
    for(int i=0;i<n2;i++) int2[i] = str2[n2-1-i]-'0';

    int*result = (int*)malloc(sizeof(int)*(n_max+1));   //n_max+1是为了储存最高位的进位
    result[n_max] = 0;                                  //首尾初始化为0
    result[0] = 0;
    for(int i =0;i<n_max;i++)
    {
       if(result[i]+int1[i]+int2[i]>=10)                //如果有进位
       {
            result[i] = (result[i]+int1[i]+int2[i])%10;    //本位对10取余
            result[i+1] = 1;                               //下一位初始化为1表示进位
       }
       else{
            result[i] = result[i] + (int1[i]+int2[i]);  
            result[i+1] = 0;                               //没有进位则下一位初始化为0
       }
    }
    
    if(result[n_max]==0)               //最高位为0,则从最高位的前一位往前开始输出
    {
        for(int i = n_max-1;i>=0;i--)
        {
            printf("%d",result[i]);
        }
    }else if(result[n_max] == 1)      //最高位为1,则从最高位开始输出
    {
        for(int i = n_max;i>=0;i--)
        {
            printf("%d",result[i]);
        }
    }
    
}
int main() {
    char str1[10000];
    char str2[10000];
    while(~scanf("%s",str1))
    {
        scanf("%s",str2);
        addint(str1,str2);

    }
}