#include<iostream>
#include<cmath>
#include<algorithm>
#include<iomanip>
#include<climits>
#include<numeric>
#include<set>
#include<sstream>
#include<map>
#include<vector>
#include<string>
#include<regex>

using namespace std;

const long long MOD = (long long)(1e9 + 7);

vector<string> split(const string& haystack, const string& needle) {
	vector<string> result;
	size_t start_pos = 0;
	size_t found_pos = haystack.find(needle, start_pos);
	while (found_pos != string::npos) {
		size_t count = found_pos - start_pos;
		string token = haystack.substr(start_pos, count);
		if (!token.empty()) {
			result.push_back(token);
		}
		start_pos = found_pos + needle.length();
		found_pos = haystack.find(needle, start_pos);
	}

	string last_token = haystack.substr(start_pos);
	if (!last_token.empty()) {
		result.push_back(last_token);
	}
	return result;
}

int main() {
	int n;cin >> n;
	cin.ignore();
	for (int i = 1;i <= n;i++) {
		map<int, int> result;
		string line;getline(cin, line);
		auto parts = split(line, " + ");
		for (auto part : parts) {
			auto value = split(part, "x^");
			result[stoi(value[1])] += stoi(value[0]);
		}

		for (auto entry = result.begin();entry != result.end();entry++) {
			cout << entry->second << "x^" << entry->first;
			if (entry != (--result.end())) {
				cout << " + ";
			}
		}
		cout << endl;
	}
	return 0;
}

