#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;
}
I2luY2x1ZGU8aW9zdHJlYW0+CiNpbmNsdWRlPGNtYXRoPgojaW5jbHVkZTxhbGdvcml0aG0+CiNpbmNsdWRlPGlvbWFuaXA+CiNpbmNsdWRlPGNsaW1pdHM+CiNpbmNsdWRlPG51bWVyaWM+CiNpbmNsdWRlPHNldD4KI2luY2x1ZGU8c3N0cmVhbT4KI2luY2x1ZGU8bWFwPgojaW5jbHVkZTx2ZWN0b3I+CiNpbmNsdWRlPHN0cmluZz4KI2luY2x1ZGU8cmVnZXg+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY29uc3QgbG9uZyBsb25nIE1PRCA9IChsb25nIGxvbmcpKDFlOSArIDcpOwoKdmVjdG9yPHN0cmluZz4gc3BsaXQoY29uc3Qgc3RyaW5nJiBoYXlzdGFjaywgY29uc3Qgc3RyaW5nJiBuZWVkbGUpIHsKCXZlY3RvcjxzdHJpbmc+IHJlc3VsdDsKCXNpemVfdCBzdGFydF9wb3MgPSAwOwoJc2l6ZV90IGZvdW5kX3BvcyA9IGhheXN0YWNrLmZpbmQobmVlZGxlLCBzdGFydF9wb3MpOwoJd2hpbGUgKGZvdW5kX3BvcyAhPSBzdHJpbmc6Om5wb3MpIHsKCQlzaXplX3QgY291bnQgPSBmb3VuZF9wb3MgLSBzdGFydF9wb3M7CgkJc3RyaW5nIHRva2VuID0gaGF5c3RhY2suc3Vic3RyKHN0YXJ0X3BvcywgY291bnQpOwoJCWlmICghdG9rZW4uZW1wdHkoKSkgewoJCQlyZXN1bHQucHVzaF9iYWNrKHRva2VuKTsKCQl9CgkJc3RhcnRfcG9zID0gZm91bmRfcG9zICsgbmVlZGxlLmxlbmd0aCgpOwoJCWZvdW5kX3BvcyA9IGhheXN0YWNrLmZpbmQobmVlZGxlLCBzdGFydF9wb3MpOwoJfQoKCXN0cmluZyBsYXN0X3Rva2VuID0gaGF5c3RhY2suc3Vic3RyKHN0YXJ0X3Bvcyk7CglpZiAoIWxhc3RfdG9rZW4uZW1wdHkoKSkgewoJCXJlc3VsdC5wdXNoX2JhY2sobGFzdF90b2tlbik7Cgl9CglyZXR1cm4gcmVzdWx0Owp9CgppbnQgbWFpbigpIHsKCWludCBuO2NpbiA+PiBuOwoJY2luLmlnbm9yZSgpOwoJZm9yIChpbnQgaSA9IDE7aSA8PSBuO2krKykgewoJCW1hcDxpbnQsIGludD4gcmVzdWx0OwoJCXN0cmluZyBsaW5lO2dldGxpbmUoY2luLCBsaW5lKTsKCQlhdXRvIHBhcnRzID0gc3BsaXQobGluZSwgIiArICIpOwoJCWZvciAoYXV0byBwYXJ0IDogcGFydHMpIHsKCQkJYXV0byB2YWx1ZSA9IHNwbGl0KHBhcnQsICJ4XiIpOwoJCQlyZXN1bHRbc3RvaSh2YWx1ZVsxXSldICs9IHN0b2kodmFsdWVbMF0pOwoJCX0KCgkJZm9yIChhdXRvIGVudHJ5ID0gcmVzdWx0LmJlZ2luKCk7ZW50cnkgIT0gcmVzdWx0LmVuZCgpO2VudHJ5KyspIHsKCQkJY291dCA8PCBlbnRyeS0+c2Vjb25kIDw8ICJ4XiIgPDwgZW50cnktPmZpcnN0OwoJCQlpZiAoZW50cnkgIT0gKC0tcmVzdWx0LmVuZCgpKSkgewoJCQkJY291dCA8PCAiICsgIjsKCQkJfQoJCX0KCQljb3V0IDw8IGVuZGw7Cgl9CglyZXR1cm4gMDsKfQoK