#include <cstdlib>
#include <iostream>
#include <string>
using namespace std;
//这一题真难,不过写出来真有成就感
int main() {
    string a, b;
    cin >> a;
    cin >> b;
 //先处理字符串
    int dot = a.find('.');
    int dot2 = b.find('.');//找两个串小数点·的下标

    int cha = dot - dot2;//小数点.前短的串需要补0
    if (cha > 0) {//说明a长b短
        b.insert(0, cha, '0');//b前插差值个0
    } else {//说明a短b长
        cha = dot2 - dot;
        a.insert(0, cha, '0');//a前插0
    }

    if (a.size() < b.size()) { //b长于a则交换,保证a为长串
        a.swap(b);
    }
    b.insert(b.size(), a.size() - b.size(), '0');//在短串b后插入ab长度差个0
    //先补齐较短一方的长度
  
//再进行运算
    int carry = 0;//存储进位位
    dot = dot > dot2 ? dot : dot2;//dot为较长子串的小数点,即为处理后的串公共的小数点
    for (int i = a.length() - 1; i > dot ; i--) {//从后往前加
        int result = (a[i] - '0' + b[i] - '0' + carry) % 10 + '0';//计算机相加之后的本位数并%10
        carry = (a[i] - '0'  + b[i] - '0' + carry) / 10;//计算进位位,结果为0/1
        a[i] = result ;  
    }



    for (int i = dot - 1; i >= 0; i--) {//往小数点.前继续加,不要忘了上一步循环最后的进位carry
        int result = (a[i] - '0' + b[i] - '0' + carry) % 10 + '0';
        carry = (a[i] + b[i] - '0' - '0' + carry) / 10;
        a[i] = result ;
    }
  //如果最高位还有进位那么必为1,在结果串a最前面插1即可
    if (carry = 1) {
        int result = (a[0] - '0' + b[0] - '0' + carry) % 10;
        string s;
        s[0] = (result + '0');
        a.insert(0, s);
        cout << a << endl;
    }


}
// 64 位输出请用 printf("%lld")