# 高精度加法

#include <iostream>
#include <vector>

using namespace std;

const int N = 1e6 + 10;

vector<int> add(vector<int> &A, vector<int> &B){
	vector<int> C;
	int t = 0;
	for(int i = 0; i < A.size() || i < B.size(); i++){
		if(i < A.size()) t += A[i];
		if(i < B.size()) t += B[i];
		C.push_back(t % 10);
		t /= 10;
	}
	if(t) C.push_back(1);
	return C;
}
int main(){
	string a, b;
	vector<int> A, B;
	cin >> a >> b;
	for(int i = a.size() - 1; i >= 0; i--) A.push_back(a[i] - '0');
	for(int i = b.size() - 1; i >= 0; i--) B.push_back(b[i] - '0');
	auto C = add(A, B);
	for(int i = C.size() - 1; i >= 0; i--) printf("%d", C[i]);
	return 0;
}
//只有C++需要高精度运算
//因为只有C++ 没有大整数类
//Python 默认是无穷


//高精度加法
//因为int 存不下 就用数组存
//存数组的方式和正常是反着来的
//因为如果按照正常顺序 在首位添加数字会很麻烦 

//在C++里用vector表示整数方便 因为vector自带一个size函数 所以不用额外开一个函数来存了

#include <iostream>
#include <vector>


using namespace std;

const int N = 1e6 + 10;
//因为防止出现边界问题 比如q[N]的话 数组长度就要多开 n + 1 所以为了更加保险多开10


//这个函数需要输出 C = A + B
vector<int> add(vector<int> &A, vector<int> &B){
    vector<int> C;
    //定义一下答案 C
    
    
    int t = 0;
    for(int i = 0; i < A.size() || i < B.size(); i++){
        if(i < A.size()) t += A[i];
        if(i < B.size()) t += B[i];
        C.push_back(t % 10);
        t /= 10;
    }
    if(t) C.push_back(1);
    
    return C;
}
//这里加上引用的原因是 为了提高效率
//如果加上引用的话 他就不会将整个数组copy一遍 会快很多


int main(){
    string a, b;
    vector<int> A, B;
    
    cin >> a >> b; // a = "123456"
    for(int i = a.size() - 1; i >= 0; i--) A.push_back(a[i] - '0');
    //因为A里面存的是整数的阿拉伯数字 所以得隐式转 减一下'0' 将阿拉伯数字转成字符存入
    
    //A = [6, 5, 4, 3, 2, 1]
    
    
    for(int i = b.size() - 1; i>= 0; i--) B.push_back(b[i] - '0');
    
    auto C = add(A, B);
    //调用add函数
    
    //因为现在数组是倒着的 所以我们要倒着输出
    for(int i = C.size() - 1; i >= 0; i--) printf("%d", C[i]);
    
    return 0;
}