#include<bits/stdc++.h>
using namespace std;
/*
题目:1268: 【基础】高精度加法 
解题思路:
第一步:用string读入两个高精度整数,s1,s2 
第二步:建立两个整数数组a和数组b,
      然后将两个高精度整数,s1,s2逆序存入两个整数数组a和数组b 
第三步:从左向右对数组a和数组b进行求和,然后将结果存入数组c
        然后,再对c数组从左向右逐一进位
第四步:从右向左,逆序输出结果        

*/
string s1,s2;//高精度整数
int a[250],b[250],c[500],len,p;
//s1,s2皆为不超过240位的正整数,所以数组a和数组b开250,
//两个不超过240位的整数相加,结果最多不会超过241位,因此c数组开500够的 
//len存两个整数中较长的字符串的长度 
int main(){
 	cin>>s1>>s2;
	// 将两个高精度整数,s1,s2逆序存入两个整数数组a和数组b 
    for(int i=0;i<s1.size();i++){
    	a[s1.size()-i-1]=s1[i]-'0';//注意:要减去字符'0' 
		/*  s[i]-->a[ ]
		     s1="968"--->869
		     s1[0]-->a[2]
		     s1[1]-->a[1]
		     s1[2]-->a[0]
		     s1[i]-->a[s1.size()-1-i]
    
    	*/
    }
//输出测试看是否有逆序,再接着继续
//	for(int i=0;i<s1.size();i++){
//		cout<<a[i]<<" ";
//	} 
    for(int i=0;i<s2.size();i++){
    	b[s2.size()-i-1]=s2[i]-'0';//注意:要减去字符'0' 
	
    }
    
    //从左向右对数组a和数组b进行求和,然后将结果存入数组c
    //    然后,再对c数组从左向右逐一进位
    //加法的次数取决于两个整数中较长的字符串长度 
    len=s1.size();
	if(s1.size()<s2.size()) {
		len=s2.size();
	}
	
	
	//逐位相加
	for(int i=0;i<len;i++){
		c[i]=a[i]+b[i];
	} 
	
	//逐位进位
	for(int i=0;i<len;i++){
		//两位的才进位, 
		if(c[i]>=10){
			c[i+1]=c[i+1]+c[i]/10;//后面的数进位,在原来的基础上加上前面一个数的十位 
			c[i]=c[i]%10;//当前的数保留个位 
		}
	} 
	
	//逆序输出结果   
	//两个不超过len位的整数做加法,结果可能是len+1位 
	//判断两个不超过len位的整数做加法,结果是len位还是len+1位
	if(c[len]!=0){
		len++;
	} 
	
	//逆序输出结果
	for(int i=len-1;i>=0;i--){
		cout<<c[i];
	}
    
    //判断是否要输出负号
	if(f=='-') cout<<'-';
	
	// 从右向左,逆序输出结果,从第一个遇到的非0元素开始输出
	for(int i=len-1;i>=0;i--){
		if(c[i]!=0){
			p=i;//从右向左,第一个0元素的下标 
			break;
		}
		
	}
	//逆序从第一个非0元素开始输出 
	for(int i=p;i>=0;i--){
		cout<<c[i];
	} 
	
	return 0;
}



/**************************************************************
	Problem: 1269
	User: hulaoshi
	Language: C++
	Result: Compile Error
****************************************************************/