#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <string.h>
using namespace std;
typedef struct node
{
int data1,data2;//data1表示系数,data2表示次方;
struct node *next;
}List;
void initList(List *&L)
{
L=(List *)malloc(sizeof(List));
List *p,*q;
p=L;
int dat1,dat2;
char dot;
while(cin>>dat1>>dot>>dat2)
{
if(dat1==0 && dat2==0) break;
q=(List *)malloc(sizeof(List));
q->data1=dat1;
q->data2=dat2;
p->next=q;
p=q;
}
p->next=NULL;
}
void addList(List *&L1,List *&L2)
{
List *p,*q,*r,*s;
p=L1->next;
q=L2->next;
while(p!=NULL)
{
int tmp=p->data2;
while(q!=NULL)
{
r=q->next;
if(q->data2==tmp)
{
q->data1+=p->data1;
break;
}
else if(r!=NULL && q->data2<tmp && r->data2>tmp)
{
s=(List *)malloc(sizeof(List));
s->data1=p->data1;
s->data2=p->data2;
q->next=s;
s->next=r;
break;
}
else if(r==NULL)
{
s=(List *)malloc(sizeof(List));
s->data1=p->data1;
s->data2=p->data2;
q->next=s;
s->next=r;
break;
}
else if(q==L2->next && tmp<q->data2)
{
s=(List *)malloc(sizeof(List));
s->data1=p->data1;
s->data2=p->data2;
L2->next=s;
s->next=q;
break;
}
else q=q->next;
}
p=p->next;
q=L2->next;
}
}
void Traverse(List *&L)
{
List *p=L->next;
while(p!=NULL)
{
if(p->data1!=0)
cout<<p->data1<<"x^"<<p->data2;
p=p->next;
if(p!=NULL && p->data1!=0)
cout<<"+";
}
}
int main()
{
List *L1,*L2;
initList(L1);
initList(L2);
addList(L1,L2);
Traverse(L2);
return 0;
}