#include <cstdio>
#include <cstring>
#include <cctype>
#include <cstdlib>
#include <algorithm>
using namespace std;

#define MAX_DEG 21

int gcd(int a, int b) {
  return b != 0 ? gcd(b, a % b) : a;
}

class Polynomial
{
public:
	int c[MAX_DEG];
	Polynomial()
	{
		memset(c,0,sizeof(c));
	}
	
	Polynomial(int tc[MAX_DEG])
	{
		memcpy(c, tc, sizeof(c));
	}
	
	Polynomial operator*(const Polynomial& p) const
	{
		int tc[MAX_DEG]={0};
		for(int i=0; i<=MAX_DEG/2; i++)
		for(int j=0; j<=MAX_DEG/2; j++)
		{
			tc[i+j]+=c[i]*p.c[j];
		}
		
		return Polynomial(tc);
	}
	
	Polynomial operator+(const Polynomial& p) const
	{
		int tc[MAX_DEG]={0};
		for(int i=0; i<21; i++)
		{
			tc[i]=c[i]+p.c[i];
		}
		
		return Polynomial(tc);
	}

	Polynomial operator%(const Polynomial& p) const
	{
		int me,pos,t,s;
		int tc[MAX_DEG]={0};
		memcpy(tc, c, sizeof(c));

		me = pos = MAX_DEG-1;
		while(!p.c[me]){ me--;  }
		while(!tc[pos]){ pos--; }

		while(pos>=me)
		{
			t = p.c[me] / gcd(tc[pos],p.c[me]);
			s = tc[pos] / gcd(tc[pos],p.c[me]);

			for(int i=pos; i>=0; i--)
			{
				tc[i] *= t;
			}

			for(int i=0; i<=me; i++)
			{
				tc[pos-i] -= (p.c[me-i]*s);
			}
			pos--;
		}
		return Polynomial(tc);
	}
	
	Polynomial operator-() const
	{
		Polynomial ret=*this;
		for(int i=0; i<MAX_DEG; i++)
			ret.c[i]*=-1;
			
		return ret;
	}
	
	bool operator<(const Polynomial& p) const
	{
		for(int i=MAX_DEG-1; i>=0; i--)
		{
			if(abs(c[i]) != abs(p.c[i])) return abs(c[i]) < abs(p.c[i]);
		}
		
		return true;
	}

	void print()
	{
		bool d=false;
 		for(int i=MAX_DEG-1; i>=0; i--)
		{
			if(c[i]!=0)
			{
				if(d) printf((c[i]>0?"+":""));
				d=true;
				if(i>0) 
				{
					if(c[i]!=1&&c[i]!=-1) printf("%d", c[i]);
					if(c[i]==-1) printf("-");
					printf("x");
					if(i!=1) printf("^%d", i);
				}
				else
				{
					printf("%d", c[i]);
				}
			}
		}
		if(!d) printf("0");
		puts("");
	}
	
	void PolyGcd()
	{
		int t=c[0];
		for(int i=0; i<MAX_DEG; i++)
		{
			if(c[i]!=0) t=gcd(t,c[i]);
			
		}
		
		
		for(int i=0; i<MAX_DEG; i++)
		{
			if(t==0) break;
			c[i]/=t;
		}
		
		for(int i=MAX_DEG-1; i>=0; i--)
		{
			if(c[i]==0) continue;
			if(c[i]>0) break;
			for(int j=0; j<MAX_DEG; j++)
				c[j]*=-1;
			break;
		}
	}
};

int pow(int n, int s)
{
	int ret=1;
	for(int i=0; i<s; i++)
		ret*=n;
		
	return ret;
}
int p;
char s[101];

int parseInt()
{
	int num=0;
	while(p<strlen(s))
	{
		if(!isdigit(s[p])) break;
		
		num*=10;
		num+=(s[p]-'0');
		p++;
	}
	
	return num;
}

Polynomial parsePolynomial()
{
	int num=-1, c[MAX_DEG]={0};
	bool f=false, fst=true, minus=false;
	
	for(; p<strlen(s); )
	{
		if(s[p]=='+'||s[p]=='-')
		{
			if(!fst)
			{
				int tp=p;
				p++;
				parseInt();
				if(s[p]=='x') p++;
				if(s[p]=='(') 
				{
					p=tp;
					break;
				}
				p=tp;
			}
			if(s[p]=='-') minus=true;
			p++;

		}
		if(num==-1) num=parseInt();
		if(s[p]=='x') 
		{
			f=true;
			p++;
		}
		
		if(s[p]=='^') p++;
		int t=parseInt();
		
		if(f&&t==0) t++;
		if(f&&num==0) num++;
		if(minus) num*=-1;
		
		if(!f) 
		{
			if(t!=0) c[0]+=pow(num, t);
			else 	 c[0]+=num;
		}
		else   c[t]+=num;
		
		num=-1;
		minus=false;
		f=false;
		fst=false;
		
		if(s[p]=='('||s[p]==')') break;
	}
	
	if(num!=-1)
	{
		if(f&&num==0) num++;
		if(minus) num*=-1;
		if(f) c[1]+=num;
		else  c[0]+=num;
	}

	return Polynomial(c);
}

Polynomial parseExp()
{
	Polynomial ret;
	bool fst=true;
	for(; p<strlen(s); )
	{
		Polynomial a;
		if(s[p]=='(') p++;
		
		a=parsePolynomial();
		
		if(s[p]==')') p++;
		
		if(s[p]=='^')
		{
			p++;
			Polynomial pw=a;
			int num=parseInt();
			for(int i=0; i<num-1; i++)
			{
				a=a*pw;
			}
		}
		
		if(fst)
		{
			ret=a;
			fst=false;
		}
		else ret=ret*a;
		
		if(s[p]=='+'||s[p]=='-') break;
	}
	
	return ret;
}

Polynomial parse()
{
	p=0;
	Polynomial ret;
	bool fst=true;
	for(; p<strlen(s);)
	{
		bool minus=false, plmi=false;
		Polynomial a;

		if(s[p]=='-')
		{
			minus=true;
			if(s[p+1]!='(') minus=false;
		}
		if(s[p]=='+'||s[p]=='-') 
		{
			plmi=true;
			if(minus||s[p]=='+') p++; 
		}

		a=parseExp();
		if(minus) a=-a;
		
		if(fst)
		{
			ret=a;
			fst=false;
		}
		else
		{
			if(plmi) ret=ret+a;
			else ret=ret*a;
		}
	}
	
	return ret;
	
}

bool isZero(Polynomial a)
{
 	for(int i=MAX_DEG-1; i>=0; i--)
	{
		if(a.c[i])
		{
			return false;
		}
	}
	return true;
}

int main()
{
	while(scanf("%s", s), s[0]!='.')
	{
		Polynomial a, b, c;
		a=parse();
		scanf("%s", s);
		b=parse();

		if(a<b) swap(a,b);

		while(!isZero(b))
		{
			c = a%b;
			a = b;
			b = c;
		}

		a.PolyGcd();
		a.print();
	}
}

Measured memory_bytes: 0