#include <iostream>
#include <cstring>
#include <vector>
using namespace std;

int str_to_int(char *s, int begin, int end){//Принимает адрес первого элемента строки и индексы первого и последнего символов, между которыми в ней (предположительно) записано число (последний не включительно).
	int val = 0;		//Возвращает объект типа int, значение которого равно этому числу.
	bool negative = 0;	//Является ли число отрицательным?
	if(s[begin] == '+') begin++;//Плюс игнорируется.
	else{
		if(s[begin] == '-'){	//Проверка на отрицательность.
			negative = 1;
			begin++;
		}
	}
	for(auto i = begin; i < end; ++i){	//Обработка самих цифр числа.
		val *= 10;
		val += s[i] - 48;
	}
	if(val == 0 && s[begin] != '0') val++; //Если значение получилось равным нулю, но в исходной строке не только ноль, значит, обрабатывается строка вида "+x", в которой при записи опускается единица
	if(negative == 1) val *= -1;
	return val;
}

void int_to_str(int val, char *s){ //Записывает в строку s число val.
	char tmp[5];
	if(val > 0) s[0] = '+';	//Проверка на отрицательность.
	else{
		val *= -1;
		s[0] = '-';
	}
	int i = 0;
	while(val > 0){
		tmp[i] = (val%10 + 48);	//В tmp хранится запись числа в обратном порядке.
		val /= 10;
		i++;
	}
	tmp[i] = 0;
	int j = 1;
	for(i = strlen(tmp)-1; i >= 0; --i){	//Переписывание элементво из tmp в s в верном порядке.
		s[j] = tmp[i];
		j++;
	}
	s[j] = 0; //Если строка получилась короче пяти символов, нужно поставить после последнего нулевой символ.
}

void erase_the_plus(char *s){	//Удаляет плюс, стоящий в начале строки.
	if(s[0] == '+'){
		for(int i = 0; s[i] != 0; ++i){
			s[i] = s[i+1];
		}
	}
}

void erase_the_one(char *s){		//Удаляет единицу из строк вида "+1x", "-1x^y".
	if((s[1] == '1') && (strlen(s) == 2)){
		s[1] = 0;
	}
}

void analyze(char *s, vector <int> &v){		//Анализирует строку и увеличивает соответствующие элементы вектора на коэфициенты при степенях х.
	if(strchr(s, 'x') == NULL) v[0] += str_to_int(s, 0, strlen(s));		//Если в строке содержится запись константаы.
	else{
		if(strchr(s, '^') == NULL) v[1] += str_to_int(s, 0, strchr(s, 'x') - s);//Строка вида "ax".
		else{
			int power = str_to_int(s, strchr(s, '^') - s + 1, strlen(s));
			v[power] += str_to_int(s, 0, strchr(s, 'x') - s);
		}
	}
}
 
vector <int> decompose(char *s){//Разбивает многочлен на слогаемые и возвращает вектор, индексы элементов которого соответствуют степеням х, а сами элементы - коэффициентам при них.
	vector <int> v(11);
	char cur_s[10];
	int i = 0, j;
	while(s[i] != 0){
		//cur_s[0] = 0;
		cur_s[0] = s[i];
		i++;
		j = 1;
		while((s[i] != '+') && (s[i] != '-') && (s[i] != 0)){	//cur_s - анализируемое в данный момент слогаемое.
			cur_s[j] = s[i];
			i++;
			j++;
		}
		cur_s[j] = 0;
		analyze(cur_s, v);
	}
	return v;
}
 
vector <int> multiplicate (vector <int> &a, vector <int> &b){	//Умножение многочленов.
	vector <int> c(21);	//Возвращает вектор, индексы элементов которого соответствуют степеням х, а сами элементы - коэффициентам при них.
	for(int i = 0; i < c.size(); ++i) c[i] = 0;
	for(int i = 0; i < a.size(); ++i){
		for(int j = 0; j < b.size(); ++j){
			c[i + j] += a[i] * b[j];
		}
	}
	return c;
}
 
void compose(char *s, vector <int> &v){	//Из элементов вектора составляет строку, в которой записан многочлен.
	for(int i = v.size() - 1; i >= 2; --i){
		if(v[i] != 0){
			char coef[6];	//Коэффициент.
			int_to_str(v[i], coef);
			erase_the_one(coef);
			strcat(s, coef);
			strcat(s, "x");
			strcat(s, "^");
			char power[2];	//Степень х.
			int_to_str(i, power);
			erase_the_plus(power);
			strcat(s, power);
		}
	}
	if(v[1] != 0){	//Записи слогаемых с первой и нулевой степенями х отличаются.
		char coef[10];
		int_to_str(v[1], coef);
		erase_the_one(coef);
		strcat(s, coef);
		strcat(s, "x");
	}
	if(v[0] != 0){
		char coef[10];
		int_to_str(v[0], coef);
		strcat(s, coef);
	}
}
 
int main() {
	char *a, *b;
	int max_number_of_symbols = 100;
	a = new char[max_number_of_symbols];
	b = new char[max_number_of_symbols];
	vector <int> a_decomposed(11, 0);
	vector <int> b_decomposed(11, 0);
	
	cin.getline(a, max_number_of_symbols);	//Ввод многочленов.
	cin.getline(b, max_number_of_symbols);
	a_decomposed = decompose(a);
	b_decomposed = decompose(b);
	
	vector <int> c_decomposed = multiplicate(a_decomposed, b_decomposed);
	char *c;
	c = new char[max_number_of_symbols];
	compose(c, c_decomposed);
	erase_the_plus(c);	//Удаляется первый плюс, если он есть.
	if(strlen(c) > 0) cout << c;
	else cout << 0;		//Если в ответе получаем константу 0.
	return 0;
}