#include <bits/stdc++.h>
using namespace std;
//#define INF MAX_INT
//copy(buf,n,str.c_str)//string转char
//sscanf(buf,"%d%d",&a,&b)//串输入处理
//sprintf(but,"%.2lf",n)//double转char *
//char *itoa(int value, char* string, int radix)//int转char* radix进制
////优读
//int read(){
// int x=0,f=1;
// char ch;
// while(ch<'0'||ch>'9') {if(ch=='-')f=-1;ch=getchar();}
// while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
// return f*x;
//}
//template<class T>void read(T &x){//read(n)
// x=0;int f=0;char ch=getchar();
// while(ch<'0'||ch>'9') {f|=(ch=='-');ch=getchar();}
// while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
// x=f?-x:x;
// return;
//}
////大数乘法
//string mult(string s,int n){
// int i,len = s.length(),temp = 0;
// for(i = len - 1;i >= 0;i--)
// {
// temp = temp + (s[i] - '0')*n;
// s[i] = (temp%10)+'0';
// temp = temp/10;//进位
// }
// char c;
// while(temp)
// {
// c = (temp%10)+'0';
// s = c + s;
// temp /= 10;
// }
// return s;
//}
////大数除法
//string div(string a, long long b){//高精度a除以单精度b
// string r, ans;
// long long d = 0;
// if (a == "0") return a;//特判
// for (int i = 0; i<a.size(); i++)
// {
// r += (d * 10 + a[i] - '0') / b + '0';//求出商
// d = (d * 10 + (a[i] - '0')) % b;//求出余数
// }
// long long p = 0;
// for (int i = 0; i<r.size(); i++)
// if (r[i] != '0') { p = i; break; }
// return r.substr(p);
//}
////大数加法
//string add(string s1,string s2){
//
// if(s1 == ""&&s2 == "")return "0";
// if(s1 == "")return s2;
// if(s2 == "")return s1;
// string maxx = s1,minn = s2;
// if(s1.length() < s2.length())
// {
// maxx = s2;
// minn = s1;
// }
// int i,a = maxx.length()-1,b = minn.length()-1;
// for(i = b;i >=0 ;--i)
// {
// maxx[a--] += minn[i] - '0';
// }
// for(i = maxx.length() - 1;i > 0;--i)
// {
// if(maxx[i] > '9')
// {
// maxx[i] -= 10;
// maxx[i-1]++;
// }
// }
//
// if(maxx[0] > '9')
// {
// maxx[0] -= 10;
// maxx = '1'+maxx;
// }
//
// return maxx;
//}
////大数减法
//string bigIntegerSub(char *s1,char *s2){
// if(s1 == s2)
// return "0"; //相等
// int len1 = strlen(s1),len2 = strlen(s2);
// if(len1 > len2)
// return subInfo(s1,s2);
// else if(len1 < len2)
// return "-" + subInfo(s2,s1); //负数
// else { //长度相等时判断大小
// for(int i = 0; i < len1; i++){
// if(s1[i]-'0' > s2[i]-'0')
// return subInfo(s1,s2);
// else if(s1[i]-'0' < s2[i]-'0')
// return "-" + subInfo(s2,s1);
// }
// }
//}
////快速幂
//ll powermod(ll a,ll b){
// ll res = 1;
// while(b)
// {
// if(b&1) res *= a;
// a *= a;
// b >>=1;
// }
// return res;
//}
////矩阵快速幂
//struct Matrix {
// int m[N][N];
// Matrix(){}
//};
//void Init(Matrix &matrix){
// for(int i = 0;i < N; i++)scanf("%d",&matrix.m[0][i]);
// for(int i = 1;i < N; i++){
// for(int j = 0;j < N; j++){
// if(i == (j+1))matrix.m[i][j] = 1;
// else matrix.m[i][j] = 0;
// }
// }
//}
//Matrix Mul(Matrix &a,Matrix &b){//矩阵相乘
// Matrix c;
// for(int i = 0; i < N; i++){
// for(int j = 0;j < N; j++){
// c.m[i][j] = 0;
// for(int k = 0; k < N; k++)c.m[i][j] += a.m[i][k]*b.m[k][j];
// c.m[i][j] %= Mod;
// }
// }
// return c;
//}
//Matrix Pow(Matrix& matrix, int k) {//矩阵幂
// Matrix res;
// for (int i = 0; i < N; ++i)
// for (int j = 0; j < N; ++j)
// if (i == j) res.m[i][j] = 1;
// else res.m[i][j] = 0;
// while (k) {
// if (k & 1) res = Mul(matrix,res);
// k >>= 1;
// matrix = Mul(matrix,matrix);
// }
// return res;
//}
////线性筛
//int prime[maxn]; //标识
//int *p = new int[maxn/2+1];//素数数组
//int fun(){
// memset(prime,0,sizeof(int)*(maxn+1));
// memset(p,0,sizeof(int)*(maxn/2));
// int i,j,t = 0;
// for(i = 2;i <= maxn;i++)
// {
// if(prime[i] == 0)
// {
// p[t++] = i;
// }
// for(j = 0;j < t && i*p[j] <= maxn;j++)
// {
// prime[i*p[j]] = 1;
// if(i%p[j] == 0)break;
// }
// }
// return t;
//}
////gcd
//int gcd(int a,int b){
// if(b > a)swap(a,b);
// int temp;
// while(b != 0)
// {
// if(b > a)swap(a,b);
// temp = a % b;
// a = b;
// b = temp;
// }
// return a;
//}
////扩展gcd
//LL exgcd(LL a,LL b,LL &x,LL &y){
// if(b == 0){
// x = 1;
// y = 0;
// return a;
// }
// LL d = exgcd(b,a%b,x,y);
// LL t = x;
// x = y;
// y = t-(a/b)*y;
// return d;
//}
////欧拉函数
//int phi[maxn+1], phi_psum[maxn+1];
//int euler_phi(int n){
// int m = sqrt(n+0.5);
// int ans = n;
// for(int i = 2; i < m; i++)if(n % i == 0){
// ans = ans/i*(i-1);
// while(n % i == 0)n /= i;
// }
// if(n > 1)ans = ans/n*(n-1);
// return ans;
//}
//void phi_table(int n) {//筛素数的方法,求解1~n所有数的欧拉phi函数值
// phi[1] = 0; //这里不计算第一个1,1和1,1是重复的,等下直接2*phi_psum[n] + 1
// for(int i = 2; i <= n; i++) if(phi[i] == 0)
// for(int j = i; j <= n; j += i) {
// if(phi[j] == 0) phi[j] = j;
// phi[j] = phi[j] / i * (i-1);
// }
//}
////二分法
//int cmp(const void *a, const void *b) {
// return *(int *) a - *(int *) b;
//}
//int bs(int *arr,int L,int R,int target){//普通的二分查找
// while( L <= R){
// int mid = (L) + (R-L)/2;
// if(arr[mid] == target)
// return mid;
// if(arr[mid] > target)
// R = mid - 1;
// else
// L = mid + 1;
// }
// return -1; // not find
//}
//int firstEqual(int arr[], int L, int R, int target) {//求最小的i,使得a[i] = target,若不存在,则返回-1
// while (L < R) {
// int mid = L + (R - L) / 2;
// if (arr[mid] < target)
// L = mid + 1;
// else
// R = mid;
// }
// if (arr[L] == target)
// return L;
// return -1;
//}
//int lastEqualNext(int arr[], int L, int R, int target) {//求最大的i的下一个元素的下标(c++中的upperbound函数),使得a[i] = target,若不存在,则返回-1
// while (L < R) {
// int m = L + (R - L) / 2;
// if (arr[m] <= target)
// L = m + 1;
// else
// R = m;
// }
// if (arr[L - 1] == target)
// return L;
// return -1;
//}
//int lastEqual(int arr[], int L, int R, int target) {//求最大的i,使得a[i] = target,若不存在,则返回-1
// while (L < R) {
// int mid = L + ((R + 1 - L) >> 1);//向上取整
// if (arr[mid] <= target)
// L = mid;
// else
// R = mid - 1;
// }
// if (arr[L] == target)
// return L;
// return -1;
//}
//int firstLarge(int arr[], int L, int R, int target) {//求最小的i,使得a[i] > target,若不存在,则返回-1
// while (L < R) {
// int m = L + ((R - L) >> 1);//向下取整
// if (arr[m] <= target)
// L = m + 1;
// else
// R = m;
// }
// if (arr[R] > target)
// return R;
// return -1;
//}
//int lastSmall(int arr[], int L, int R, int target) {//求最大的i,使得a[i] < target,若不存在,则返回-1
// while (L < R) {
// int m = L + ((R + 1 - L) >> 1);//向上取整
// if (arr[m] < target)
// L = m;
// else
// R = m - 1;
// }
// if (arr[L] < target)
// return L;
// return -1;
//}
////kmp
//void getNext(int *p,int next[]) { //优化后的求next数组的方法
// int len = m;
// next[0] = -1; //next 数组中的 最大长度值(前后缀的公共最大长度) 的第一个 赋值为 -1
// int k = -1,j = 0;
// while (j < len - 1) {
// if (k == -1 || p[j] == p[k]) { //p[k]表示前缀 p[j] 表示后缀
// k++; j++;
// if(p[j] != p[k])next[j] = k;
// else next[j] = next[k]; //因为不能出现p[j] = p[ next[j ]],所以当出现时需要继续递归,k = next[k] = next[next[k]]
// }
// else k = next[k];
// }
//}
//int KMPSerach(int *s, int *p) {
// int sLen = n,pLen = m;
// int i = 0, j = 0;
// while (i < sLen && j < pLen) {
// if (j == -1 || s[i] == p[j])i++, j++;
// else j = nexts[j];
// }
// if (j == pLen)return i - j;
// else return -1;
//}
////揹包问题
//
////最大线段和
//int maxsum(int n,int b[]){
// int sum = 0,temp = 0;
// for(int i = 0;i < n;i++)
// {
// temp>0?temp+=b[i]:temp=b[i];
// if(temp > sum)sum = temp;
// }
// return sum;
//}
//int maxsum2(int m,int n,int **a){
// int *b = new int[n],sum = 0;
// for(int i = 0;i < m;i++)
// {
// for(int k = 0;k < n;k++)
// b[k] = 0;
// for(int j = i;j < m;j++)
// {
// for(int k = 0;k < n;k++)
// b[k] += a[j][k];
// int temp = maxsum(n,b);
// if(temp > sum)sum = temp;
// }
// }
// return sum;
//}
////全排列(去重)
//void permutation(int *arr,int *p,int n,int cur){
// if(cur == n){
// for(int i = 0; i < n; i++)
// printf("%d ",arr[i]);
// printf("\n");
// }else for(int i = 0; i < n; i++)if(!i || p[i] != p[i-1]){
// int c1 = 0, c2 = 0;
// for(int j = 0; j < n; j++)
// if(p[j] == p[i]) // 重复元素的个数
// c1++;
// for(int j = 0; j < cur; j++)
// if(arr[j] == p[i]) // 前面已经排列的重复元素的个数
// c2++;
// if(c2 < c1){
// arr[cur] = p[i];
// permutation(arr, p, n, cur+1);
// }
// }
//}
////全排列(函重)
//void permutation(int arr[], int cur, int n){
// if( cur == n){
// for(int i = 0; i < n; i++)
// printf("%d ", arr[i]);
// printf("\n");
// }
// else for(int i = cur; i < n; i++){
// swap(arr[i], arr[cur]);
// permutation(arr, cur+1, n);
// swap(arr[i], arr[cur]);
// }
//}
////n后排列
//int vis[n],path[n],count = 0;
//memset(path,0,sizeof(path));memset(vis,0,sizeof(vis));DFS(1);
//void DFS(int tmp){//tmp目前排了多少皇后,x目前排的列,path具体排法
// if (tmp == 9)
// { //8个行均排满
// count++;
// for (int i = 1; i <= 8; i++)
// {
// printf("%d ",path[i]);
// }
// printf(" %d\n",count);
// return;
// }
// for (int i = 1; i <= 8; i++)//8个列循环扫描
// {
// if (!vis[i])
// {
// bool flag = false;
// for (int j = 1; j < tmp; j++)
// {
// if (tmp - i == j - path[j] || tmp + i == path[j] + j)
// {
// flag = true;
// break;
// }
// }
// if (flag) continue;
// vis[i] = true;
// path[tmp] = i;//标记位置
// DFS(tmp + 1);//下一行
// vis[i] = false;
// path[tmp] = 0;
// }
// }
//}
////并查集
//int parent[maxn], rank[maxn]; //parent[]保存祖先,rank记录每个'树的高度'
//void init(){
// for(int i = 0; i < maxn; i++)parent[i] = i; //注意这里
// for(int i = 0; i < maxn; i++)rank[i] = 1;
//}
//int findRoot(int v){
// while(parent[v] != v){
// parent[v] = parent[parent[v]]; // 路径压缩
// v = parent[v];
// }
// return v;
//}
//void unions(int a, int b){
// int aRoot = findRoot(a);
// int bRoot = findRoot(b);
// if (aRoot == bRoot)
// return;
// if (rank[aRoot] < rank[bRoot])
// parent[aRoot] = bRoot;
// else if(rank[aRoot] > rank[bRoot]){
// parent[bRoot] = aRoot;
// }else{
// parent[aRoot] = bRoot;
// rank[bRoot]++;
// }
//}
//int is_same(int x,int y){ //检查是不是在同一个集合中
// return findRoot(x) == findRoot(y);
//}
////树状数组
//int lowbit(int x){//计算2^k
// return x&(-x);
//}
//void update(int i,int val){//更新数组的值
// while(i < maxn){ //注意这里是最大的x,没有记录所以用maxn,不能用n
// c[i] += val;
// i += lowbit(i); //不断的往上面更新
// }
//}
//int sum(int i){//查询
// int s = 0;
// while(i > 0){
// s += c[i];
// i -= lowbit(i); //不断的往下面加
// }
// return s;
//}
////LCS
//int LCS(char *s1,char *s2){
// int len1 = strlen(s1)-1,len2 = strlen(s2)-1;//注意例如 abcfbc的strlen(s1)为7,所以是strlen(s1) - 1
// for(int i = 0; i <= len1; i++) dp[i][0] = 0;
// for(int i = 0; i <= len2; i++) dp[0][i] = 0;
// for(int i = 1; i <= len1; i++){
// for(int j = 1; j <= len2; j++)
// if(s1[i] == s2[j]){
// dp[i][j] = dp[i-1][j-1] + 1;
// path[i][j] = 1;
// }
// else if(dp[i-1][j] >= dp[i][j-1]) {
// dp[i][j] = dp[i-1][j];
// path[i][j] = 2;
// }
// else {
// dp[i][j] = dp[i][j-1];
// path[i][j] = 3;
// }
// }
// return dp[len1][len2];
//}
////堆优化dijkstra
//struct Node{
// int v,w;
// Node(int v,int w):v(v),w(w){}
// bool operator < (const Node&rhs) const {
// return rhs.w < w;
// }
//};
//vector<Node>G[maxn];
//bool vis[maxn];
//int d[maxn];
//int n,m;
//void init(){
// for(int i = 0; i < maxn; i++)G[i].clear();
// for(int i = 0; i < maxn; i++)vis[i] = false;
// for(int i = 0; i < maxn; i++)d[i] = INF;
//}
//int dijkstra(int s,int e){ //传入起点终点
// priority_queue<Node>q;
// q.push(Node(s,0));
// d[s] = 0;
// while(!q.empty()){
// Node now = q.top(); q.pop();
// int v = now.v;
// if(vis[v])continue;
// vis[v] = true;
// for(int i = 0; i < G[v].size(); i++){
// int v2 = G[v][i].v;
// int w = G[v][i].w;
// if(!vis[v2] && d[v2] > w+d[v]){
// d[v2] = w+d[v];
// q.push(Node(v2,d[v2]));
// }
// }
// }
// return d[e];
//}
////用于最长非递减子序列种的lower_bound函数
//int cmp(int a,int b){
// return a <= b;
//}
////最长上升子序列
////dp[i]表示长度为i+1的上升子序列的最末尾元素 找到第一个比dp末尾大的来代替
//int LIS(int n){
// memset(dp, 0x3f, sizeof(dp));
// pos[0] = -1;
// int i,lpos;
// for (i = 0; i < n; ++i){
// dp[lpos = (lower_bound(dp, dp + n, a[i]) - dp)] = a[i];
// pos[lpos] = i; // *靠后打印
// fa[i] = (lpos ? pos[lpos - 1] : -1);
// }
// n = lower_bound(dp, dp + n, INF) - dp;
// for (i = pos[n - 1]; ~fa[i]; i = fa[i]) ans.push_back(a[i]);
// ans.push_back(a[i]);
// return n;
//}
////非递减的LIS
//int LISS(int n){
// memset(dp, 0x3f, sizeof(dp));
// pos[0] = -1;
// int i,lpos;
// for (i = 0; i < n; i++){
// dp[lpos = (lower_bound(dp, dp + n, a[i],cmp) - dp)] = a[i]; //注意这里cmp
// pos[lpos] = i; // *靠后打印
// fa[i] = (lpos ? pos[lpos - 1] : -1);
// }
// n = lower_bound(dp, dp + n, INF) - dp;
// for (i = pos[n - 1]; ~fa[i]; i = fa[i]) ans.push_back(a[i]);
// ans.push_back(a[i]);
// return n;
//}
int main()
{
int a,b;
cin >> a >> b;
cout << a+b << endl;
return 0;
}