// 求整数部分不补零的方法(vector<char>/string前置补零时间复杂度高)
#include <iostream>
#include <string>
using namespace std;

// 获取整数部分
string getInteger(string a) {
	return a.substr(0, a.find("."));
}
// 获取小数部分
string getFraction(string a) {
	return a.substr(a.find(".") + 1, a.size() - a.find("."));
}

// 当需要返回多个值时。使用引用参数 返回信息
void fractionPlus(string& res, int& carry, string fa, string fb) {
	int size = max(fa.size(), fb.size()); 
	while (fa.size() < size) {
		fa.push_back('0');  // 补0
	}
	while (fb.size() < size) {
		fb.push_back('0');  // 补0
	}
	res.resize(size);  
	carry = 0;  
	for (int i = size - 1; i >= 0; i--) { 
		if (fa[i] + fb[i] - '0' + carry > '9') { // 有进位
			res[i] = fa[i] + fb[i] - '0' + carry - 10;  // 取余数 -10
			carry = 1;
		}
		else {  // 无进位
			res[i] = fa[i] + fb[i] - '0' + carry; 
			carry = 0;
		}
	}
	return; //要不要无所谓,void 不用返回
}

void integerPlus(string& res, int carry, string ia, string ib) {
	// !!! carry = 1。 a访问完,b访问完,carry=1也要进循环内
	for (int i = ia.size() - 1, j = ib.size() - 1;
		i >= 0 || j >= 0 || carry == 1;
		i--,j--) {  // a没访问完 || b没访问完 || 进位为1(a="99" b="11"最高位进位情况) 进入循环
		if (i >= 0 && j >= 0) { // a没访问完 + b没访问完
			if (ia[i] + ib[j] + carry - '0' > '9') { //访问ib 用j
				// !!! 下面是错误的,res没申请空间,不能直接访问。用res.resize(n);申请
				// res[i] = ia[i] + ib[i] + carry - '0' - 10; // 取余
				// 用取余 插入(后续情况类似)
				res.insert(res.begin(), ia[i] + ib[j] + carry - '0' - 10) ; 
				carry = 1; 
			}
			else {
				res.insert(res.begin(), ia[i] + ib[j] + carry - '0');
				carry = 0;
			}
		}
		else if(i >= 0 && j < 0) {  // a没访问完,b访问完了 a='99' b='1'
			// ib[i] 当0
			if (ia[i] + carry > '9') {  // 单独访问一个ia/ib不用 -'0',默认其中一个为0,不加
				res.insert(res.begin(), ia[i] + carry - 10); // 取余
				carry = 1;
			}
			else {
				res.insert(res.begin(), ia[i] + carry);
				carry = 0;
			}
		}
		else if (i < 0 && j >= 0) { // a访问完了,b没访问完 a='1' b='99'
			// ia[i] 当0
			if (ib[j] + carry > '9') { // 单独访问一个ia/ib不用 -'0',默认其中一个为0,不加
				res.insert(res.begin(), ib[j] + carry - 10); // 取余
				carry = 1;
			}
			else {
				res.insert(res.begin(), ib[j] + carry);
				carry = 0;
			}
		}
		else {  // a,b都访问完了,但是最高位有进位 a='99' b='10'
			res.insert(res.begin(),'1');  // 最高位补1
		}
	}
	return; //要不要无所谓,void 不用返回
}


int main() {
	char arra[1000] = { 0 }; // 初始化
	char arrb[1000] = { 0 }; 
	while (scanf("%s%s",arra,arrb) != EOF) {  //没结束
		string a = arra;
		string b = arrb;
		
		string ia = getInteger(a);
		string ib = getInteger(b);
		string fa = getFraction(a);
		string fb = getFraction(b);

		string fres;  // 小数部分结果
		int carry;  
		fractionPlus(fres, carry, fa, fb);
		string ires;  // 整数部分结果
		integerPlus(ires, carry, ia, ib);

		// string 输出用.c_str()方法
		printf("%s.%s",ires.c_str(), fres.c_str());
	}

	return 0;
}