#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN=1005;
bool isPrime[MAXN];
int prime[MAXN],cnt;
void sieve()
{
memset(isPrime,true,sizeof(isPrime));
for(int i=2;i<=1000;i++)
{
if(isPrime[i])
{
prime[cnt++]=i;
for(int j=i+i;j<=1000;j+=i)
isPrime[j]=false;
}
}
}
char sa[MAXN];
char sb[MAXN];
struct BigInt{
int e[MAXN];
int len;
BigInt()
{
memset(e,0,sizeof(e));
len=0;
}
BigInt(const char s[])
{
memset(e,0,sizeof(e));
len=0;
int l=strlen(s);
int z=0;
for(int i=0;i<l;i++)
{
if(s[i]==',')
{
e[len++]=z;
z=0;
}
else
{
z*=10;
z=z+(s[i]-'0');
}
}
e[len++]=z;
for(int i=0;i<len/2;i++)
{
int t=e[i];
e[i]=e[len-i-1];
e[len-i-1]=t;
}
}
BigInt operator+(const BigInt &t)const
{
BigInt res;
res.len=max(len,t.len);
int up=0;
int i;
for(i=0;i<res.len;i++)
{
int z=e[i]+t.e[i]+up;
res.e[i]=z%prime[i];
up=z/prime[i];
}
while(up!=0)
{
res.e[res.len++]=up%prime[i];
up/=prime[i];
i++;
}
return res;
}
void print()
{
for(int i=len-1;i>=1;i--)
{
printf("%d,",e[i]);
}
printf("%d
",e[0]);
}
};
int main()
{
sieve();
while(scanf("%s %s",sa,sb)!=EOF)
{
BigInt a(sa);
BigInt b(sb);
if((a.len==1&&a.e[0]==0)||(b.len==1&&b.e[0]==0))
break;
BigInt res;
res=a+b;
res.print();
}
return 0;
}
/**************************************************************
Problem: 1016
User: baneHunter
Language: C++
Result: Accepted
Time:10 ms
Memory:1028 kb
****************************************************************/