#include <iostream>
using namespace std;
typedef struct node {
int g, s, k;
}Node;
int main()
{
Node A, B;
scanf("%d.%d.%d", &A.g, &A.s, &A.k);
scanf("%d.%d.%d", &B.g, &B.s, &B.k);
Node ans = { 0,0,0 };
ans.k = A.k + B.k;
ans.s = ans.k / 29;
ans.k = ans.k % 29;
ans.s += A.s + B.s;
ans.g = ans.s / 17;
ans.s = ans.s % 17;
ans.g += A.g + B.g;
cout << ans.g << '.' << ans.s << '.' << ans.k;
return 0;
}
//这个是第一个版本,因为考虑到了输入数据可能会省略后边的0,对输入数据做了处理;
//但经过测试不考虑这个问题一样可以过,所以才有了上边的简略版
#include <iostream>
#include <string>
#include <queue>
#pragma warning(disable:4996)
using namespace std;
typedef struct node {
int g, s, k;
}Node;
int main()
{
string A, B;
cin >> A >> B;
Node a, b;
a = b = { 0,0,0 };
queue<int> S;
int num = 0;
for (int i = 0; i<A.length(); i++) {
if (A[i] == '.') {
S.push(num);
num = 0;
}
else {
num = num*10+ (A[i] - '0');
}
}
S.push(num);
if (!S.empty()) { a.g = S.front(); S.pop(); }
if (!S.empty()) { a.s = S.front(); S.pop(); }
if (!S.empty()) { a.k = S.front(); S.pop(); }
num = 0;
for (int i = 0; i < B.length(); i++) {
if (B[i] == '.') {
S.push(num);
num = 0;
}
else {
num = num * 10 + (B[i] - '0');
}
}
S.push(num);
if (!S.empty()) { b.g = S.front(); S.pop(); }
if (!S.empty()) { b.s = S.front(); S.pop(); }
if (!S.empty()) { b.k = S.front(); S.pop(); }
Node ans = { 0,0,0 };
ans.k = a.k + b.k;
ans.s = ans.k / 29;
ans.k = ans.k % 29;
ans.s += a.s + b.s;
ans.g = ans.s / 17;
ans.s = ans.s % 17;
ans.g += a.g + b.g;
cout << ans.g << '.' << ans.s << '.' << ans.k;
return 0;
}