#include<bits/stdc++.h>
using namespace std;
struct bigint {
int size;
vector<int> a;
bool re;
bigint() {
a.clear();
size=0;
re=1;
}
void operator=(string s) {
a.clear();
if (s[0]=='-') {
re=0;
size=s.size()-1;
for (int i=s.size()-1,j=0; i; i--,j++)a.push_back(s[i]^48);
} else {
re=1;
size=s.size();
for (int i=s.size()-1,j=0; i>=0; i--,j++)a.push_back(s[i]^48);
}
if(s=="0")size=0;
return;
}
void operator=(long long n) {
string s=to_string(n);
a.clear();
if (s[0]=='-') {
re=0;
size=s.size()-1;
for (int i=s.size()-1,j=0; i; i--,j++)a.push_back(s[i]^48);
} else {
re=1;
size=s.size();
for (int i=s.size()-1,j=0; i>=0; i--,j++)a.push_back(s[i]^48);
}
if(s=="0")size=0;
return;
}
bool operator==(bigint b) {
if (re!=b.re)return 0;
if (size!=b.size)return 0;
for (int i=0; i<size; i++)if (a[i]!=b.a[i])return 0;
return 1;
}
bool operator!=(bigint b) {
if (re!=b.re)return 1;
if (size!=b.size)return 1;
for (int i=0; i<size; i++)if (a[i]!=b.a[i])return 1;
return 0;
}
bool operator<(bigint b) {
if (re!=b.re)return re<b.re;
if (size!=b.size)return size<b.size;
for (int i=size-1; i>=0; i--)if (a[i]!=b.a[i])return a[i]<b.a[i];
return 0;
}
bool operator<=(bigint b) {
if (re!=b.re)return re<b.re;
if (size!=b.size)return size<b.size;
for (int i=size-1; i>=0; i--)if (a[i]!=b.a[i])return a[i]<b.a[i];
return 1;
}
bool operator>(bigint b) {
if (re!=b.re)return re>b.re;
if (size!=b.size)return size>b.size;
for (int i=size-1; i>=0; i--)if (a[i]!=b.a[i])return a[i]>b.a[i];
return 0;
}
bool operator>=(bigint b) {
if (re!=b.re)return re>b.re;
if (size!=b.size)return size>b.size;
for (int i=size-1; i>=0; i--)if (a[i]!=b.a[i])return a[i]>b.a[i];
return 1;
}
bigint operator+(bigint b) {
bigint c;
if (re&&b.re) {
c.size=max(size,b.size);
for (int i=0; i<min(size,b.size); i++) c.a.push_back(a[i]+b.a[i]);
if (size>b.size) for (int i=b.size; i<size; i++)c.a.push_back(a[i]);
else for (int i=size; i<b.size; i++)c.a.push_back(b.a[i]);
for (int i=1; i<c.size; i++) c.a[i]+=c.a[i-1]/10,c.a[i-1]%=10;
if(c.size)if (c.a[c.size-1]>9) c.a.push_back(1),c.a[c.size-1]%=10,c.size++;
return c;
} else if (!re&&!b.re) {
c.size=max(size,b.size);
for (int i=0; i<min(size,b.size); i++) c.a.push_back(a[i]+b.a[i]);
if (size>b.size) for (int i=b.size; i<size; i++)c.a.push_back(a[i]);
else for (int i=size; i<b.size; i++)c.a.push_back(b.a[i]);
for (int i=1; i<c.size; i++) c.a[i]+=c.a[i-1]/10,c.a[i-1]%=10;
if(c.size)if (c.a[c.size-1]>9)c.a.push_back(1),c.a[c.size-1]%=10,c.size++;
c.re=0;
return c;
}else if (re&&!b.re){
b.re=1;
if (*this >= b) {
c.size = max(size, b.size);
for (int i=0;i<c.size;i++)c.a.push_back(0);
for (int i = 0; i < c.size; i++) {
c.a[i] += a[i] - b.a[i];
if (c.a[i] < 0)c.a[i + 1]--, c.a[i] += 10;
}
for (int i = 0; i <= c.size + 10; i++) c.a[i + 1] += c.a[i] / 10,c.a[i] %= 10;
for (; !c.a[c.size - 1] && c.size;)c.size--;
b.re=0;
return c;
} else {
c.size = max(size, b.size),c = b - *this,c.re = 0,b.re=0;
return c;
}
}
return b+*this;
}
void operator+=(bigint b) {
*this=*this+b;
return;
}
bigint operator-(bigint b) {
bigint c;
if (re&&!b.re) {
c.size=max(size,b.size);
for (int i=0; i<min(size,b.size); i++) c.a.push_back(a[i]+b.a[i]);
if (size>b.size) for (int i=b.size; i<size; i++)c.a.push_back(a[i]);
else for (int i=size; i<b.size; i++)c.a.push_back(b.a[i]);
for (int i=1; i<c.size; i++) c.a[i]+=c.a[i-1]/10,c.a[i-1]%=10;
if(c.size)if (c.a[c.size-1]>9) c.a.push_back(1),c.a[c.size-1]%=10,c.size++;
return c;
}
if (!re&&b.re) {
c.size=max(size,b.size);
for (int i=0; i<min(size,b.size); i++) c.a.push_back(a[i]+b.a[i]);
if (size>b.size) for (int i=b.size; i<size; i++)c.a.push_back(a[i]);
else for (int i=size; i<b.size; i++)c.a.push_back(b.a[i]);
for (int i=1; i<c.size; i++) c.a[i]+=c.a[i-1]/10,c.a[i-1]%=10;
if(c.size)if (c.a[c.size-1]>9)c.a.push_back(1),c.a[c.size-1]%=10,c.size++;
c.re=0;
return c;
}
if (re&&b.re) {
if (*this >= b) {
c.size = max(size, b.size);
for (int i=0;i<c.size;i++)c.a.push_back(0);
for (int i = 0; i < c.size; i++) {
c.a[i] += a[i] - b.a[i];
if (c.a[i] < 0)c.a[i + 1]--, c.a[i] += 10;
}
for (int i = 0; i <= c.size + 10; i++) c.a[i + 1] += c.a[i] / 10,c.a[i] %= 10;
for (; !c.a[c.size - 1] && c.size;)c.size--;
return c;
} else {
c.size = max(size, b.size),c = b - *this,c.re = 0;
return c;
}
}
}
bigint operator*(bigint b) {
bigint c,zero;
zero="0";
if (*this==zero||b==zero)return zero;
if (!(re^b.re)) {
c.size=size+b.size;
for (int i=0; i<c.size; i++) c.a.push_back(0);
for (int i=0; i<size; i++) for (int j=0; j<b.size; j++) c.a[i+j]+=a[i]*b.a[j];
for (int i=0; i<c.size-1; i++) c.a[i+1]+=c.a[i]/10,c.a[i]%=10;
if (c.a[c.size-1]==0) c.size--;
return c;
}
c.size=size+b.size,c.re=0;
for (int i=0; i<c.size; i++) c.a.push_back(0);
for (int i=0; i<size; i++) for (int j=0; j<b.size; j++) c.a[i+j]+=a[i]*b.a[j];
for (int i=0; i<c.size-1; i++) c.a[i+1]+=c.a[i]/10,c.a[i]%=10;
if (c.a[c.size-1]==0) c.size--;
return c;
}
void operator*=(bigint b) {
*this=*this*b;
return;
}
bigint operator/(bigint b) {
}
};
istream& operator>>(istream &inp,bigint &n) {
string s;
inp>>s;
if (s[0]=='-') {
n.re=0,n.size=s.size()-1;
for (int i=s.size()-1,j=0; i; i--,j++)n.a.push_back(s[i]^48);
} else {
n.re=1,n.size=s.size();
for (int i=s.size()-1,j=0; i>=0; i--,j++)n.a.push_back(s[i]^48);
}
if(s=="0")n.size=0;
return inp;
}
ostream& operator<<(ostream &out,bigint n) {
if (n.size==0)return putchar('0'),out;
if (n.re==0)putchar('-');
for (int i=n.size-1; i>=0; i--) {
putchar(n.a[i]+48);
}
return out;
}
bigint a,b;
int main() {
cin>>a>>b;
cout<<a+b;
return 0;
}