//
// ttp://www.itmedia.co.jp/enterprise/articles/1004/03/news002_2.html
//
#include <algorithm>
#include <iostream>
#include <set>
#include <string>
#include <vector>
#define FOR(I,S,E) for(int (I)=(S); (I)<(E); (I)++)
#define REP(I,E) FOR((I),0,(E))
using std::string;
typedef std::vector<string> vstr;
typedef std::vector<vstr> vvstr;
typedef std::set<vstr> svstr;
typedef std::set<string> sstr;
svstr isComplete(vstr &pai);
int getPaiNumber(string pai);
int isSamePaiTwo(string pai1, string pai2);
int isSamePaiThree(string pai1, string pai2, string pai3);
int isSameSuitTwo(string pai1, string pai2);
int isSameSuitThree(string pai1, string pai2, string pai3);
int isSequenceTwo(string pai1, string pai2);
int isSequenceThree(string pai1, string pai2, string pai3);
int main() {
vstr pai(14);
string str;
std::cin >> str;
REP(i,13) {
pai[i] = str.substr(i, 1);
}
sstr ans;
FOR(i,1,10) {
string p = std::to_string(i);
pai[13] = p;
svstr res = isComplete(pai);
for (svstr::iterator it = res.begin(); it != res.end(); it++) {
REP(j, 5) {
size_t x = (*it)[j].find(p);
if (x == string::npos) continue;
vstr tv(5);
REP (k, 5) {
if (k != j)
tv[k] = "(" + (*it)[k] + ")";
else {
string ts = (*it)[k];
tv[k] = "[" + ts.erase(x, 1) + "]";
}
}
std::sort(tv.begin(), tv.end());
str.clear();
REP (k, 5) str += tv[k];
ans.insert(str);
}
}
}
for (sstr::iterator it = ans.begin(); it != ans.end(); it++) {
std::cout << (*it) << std::endl;
}
return 0;
}
svstr isComplete(vstr &pai) {
#define EQ1(x,a) ((x)==(a))
#define EQ2(x,a,b) (EQ1(x,a)||EQ1(x,b))
#define EQ3(x,a,b,c) (EQ2(x,a,b)||EQ1(x,c))
#define EQ4(x,a,b,c,d) (EQ2(x,a,b)||EQ2(x,c,d))
#define EQ5(x,a,b,c,d,e) (EQ3(x,a,b,c)||EQ2(a,d,e))
#define EQ6(x,a,b,c,d,e,f) (EQ3(x,a,b,c)||EQ3(x,d,e,f))
#define EQ7(x,a,b,c,d,e,f,g) (EQ4(x,a,b,c,d)||EQ3(x,e,f,g))
#define NG2(a,b) (!isSamePaiTwo(pai[a],pai[b])&&!isSequenceTwo(pai[a],pai[b]))
#define NG3(a,b,c) (!isSamePaiThree(pai[a],pai[b],pai[c]) \
&&!isSequenceThree(pai[a],pai[b],pai[c]))
svstr res;
REP(j1,14) {
REP(j2,14) {
if EQ1(j2,j1) continue;
if NG2(j1,j2) continue;
REP(j3,14) {
if EQ2(j3,j2,j1) continue;
if NG3(j1,j2,j3) continue;
REP(j4,14) {
if EQ3(j4,j3,j2,j1) continue;
REP(j5,14) {
if EQ4(j5,j4,j3,j2,j1) continue;
if NG2(j4,j5) continue;
REP(j6,14) {
if EQ5(j6,j5,j4,j3,j2,j1) continue;
if NG3(j4,j5,j6) continue;
REP(j7,14) {
if EQ6(j7,j6,j5,j4,j3,j2,j1) continue;
REP(j8,14) {
if EQ6(j8,j6,j5,j4,j3,j2,j1) continue;
if EQ1(j8,j7) continue;
if NG2(j7,j8) continue;
REP(j9,14) {
if EQ6(j9,j6,j5,j4,j3,j2,j1) continue;
if EQ2(j9,j8,j7) continue;
if NG3(j7,j8,j9) continue;
REP(j10,14) {
if EQ6(j10,j6,j5,j4,j3,j2,j1) continue;
if EQ3(j10,j9,j8,j7) continue;
REP(j11,14) {
if EQ6(j11,j6,j5,j4,j3,j2,j1) continue;
if EQ4(j11,j10,j9,j8,j7) continue;
if NG2(j10,j11) continue;
REP(j12,14) {
if EQ6(j12,j6,j5,j4,j3,j2,j1) continue;
if EQ5(j12,j11,j10,j9,j8,j7) continue;
if NG3(j10,j11,j12) continue;
REP(j13,14) {
if EQ6(j13,j6,j5,j4,j3,j2,j1) continue;
if EQ6(j13,j12,j11,j10,j9,j8,j7) continue;
REP(j14,14) {
if EQ6(j14,j6,j5,j4,j3,j2,j1) continue;
if EQ7(j14,j13,j12,j11,j10,j9,j8,j7) continue;
if (!isSamePaiTwo(pai[j13], pai[j14])) continue;
vstr te(4);
te[0] = pai[j1] + pai[j2] + pai[j3];
te[1] = pai[j4] + pai[j5] + pai[j6];
te[2] = pai[j7] + pai[j8] + pai[j9];
te[3] = pai[j10] + pai[j11] + pai[j12];
REP(i, 4) {
std::sort(te[i].begin(), te[i].end());
}
std::sort(te.begin(), te.end());
te.push_back(pai[j13] + pai[j14]);
res.insert(te);
} } } } }
} } } } }
} } } }
return res;
}
int getPaiNumber(string pai) {
return std::stoi(pai);
}
int isSamePaiTwo(string pai1, string pai2) {
return pai1.compare(pai2) == 0;
}
int isSamePaiThree(string pai1, string pai2, string pai3) {
return isSamePaiTwo(pai1, pai2) && isSamePaiTwo(pai2, pai3);
}
int isSameSuitTwo(string pai1, string pai2) {
return true;
}
int isSameSuitThree(string pai1, string pai2, string pai3) {
return isSameSuitTwo(pai1, pai2) && isSameSuitTwo(pai2, pai3);
}
int isSequenceTwo(string pai1, string pai2) {
return isSameSuitTwo(pai1, pai2)
&& getPaiNumber(pai2) - getPaiNumber(pai1) == 1;
}
int isSequenceThree(string pai1, string pai2, string pai3) {
return isSequenceTwo(pai1, pai2) && isSequenceTwo(pai2, pai3);
}
Ly8KLy8gdHRwOi8vd3d3Lml0bWVkaWEuY28uanAvZW50ZXJwcmlzZS9hcnRpY2xlcy8xMDA0LzAzL25ld3MwMDJfMi5odG1sCi8vIAoKI2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c2V0PgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8dmVjdG9yPgoKI2RlZmluZSBGT1IoSSxTLEUpIGZvcihpbnQgKEkpPShTKTsgKEkpPChFKTsgKEkpKyspCiNkZWZpbmUgUkVQKEksRSkgRk9SKChJKSwwLChFKSkKCgp1c2luZyBzdGQ6OnN0cmluZzsKCnR5cGVkZWYgc3RkOjp2ZWN0b3I8c3RyaW5nPiB2c3RyOwp0eXBlZGVmIHN0ZDo6dmVjdG9yPHZzdHI+IHZ2c3RyOwp0eXBlZGVmIHN0ZDo6c2V0PHZzdHI+IHN2c3RyOwp0eXBlZGVmIHN0ZDo6c2V0PHN0cmluZz4gc3N0cjsKCnN2c3RyIGlzQ29tcGxldGUodnN0ciAmcGFpKTsKaW50IGdldFBhaU51bWJlcihzdHJpbmcgcGFpKTsKaW50IGlzU2FtZVBhaVR3byhzdHJpbmcgcGFpMSwgc3RyaW5nIHBhaTIpOwppbnQgaXNTYW1lUGFpVGhyZWUoc3RyaW5nIHBhaTEsIHN0cmluZyBwYWkyLCBzdHJpbmcgcGFpMyk7CmludCBpc1NhbWVTdWl0VHdvKHN0cmluZyBwYWkxLCBzdHJpbmcgcGFpMik7CmludCBpc1NhbWVTdWl0VGhyZWUoc3RyaW5nIHBhaTEsIHN0cmluZyBwYWkyLCBzdHJpbmcgcGFpMyk7CmludCBpc1NlcXVlbmNlVHdvKHN0cmluZyBwYWkxLCBzdHJpbmcgcGFpMik7CmludCBpc1NlcXVlbmNlVGhyZWUoc3RyaW5nIHBhaTEsIHN0cmluZyBwYWkyLCBzdHJpbmcgcGFpMyk7CgppbnQgbWFpbigpIHsKCQoJCgl2c3RyIHBhaSgxNCk7CgkKCXN0cmluZyBzdHI7CgkKCXN0ZDo6Y2luID4+IHN0cjsKCQoJUkVQKGksMTMpIHsKCQlwYWlbaV0gPSBzdHIuc3Vic3RyKGksIDEpOwoJfQoJCglzc3RyIGFuczsKCQoJRk9SKGksMSwxMCkgewoJCXN0cmluZyBwID0gc3RkOjp0b19zdHJpbmcoaSk7CgkJcGFpWzEzXSA9IHA7CgkJc3ZzdHIgcmVzID0gaXNDb21wbGV0ZShwYWkpOwoJCWZvciAoc3ZzdHI6Oml0ZXJhdG9yIGl0ID0gcmVzLmJlZ2luKCk7IGl0ICE9IHJlcy5lbmQoKTsgaXQrKykgewoJCQlSRVAoaiwgNSkgewoJCQkJc2l6ZV90IHggPSAoKml0KVtqXS5maW5kKHApOwoJCQkJaWYgKHggPT0gc3RyaW5nOjpucG9zKSBjb250aW51ZTsKCQkJCXZzdHIgdHYoNSk7CgkJCQlSRVAgKGssIDUpIHsKCQkJCQlpZiAoayAhPSBqKQoJCQkJCQl0dltrXSA9ICIoIiArICgqaXQpW2tdICsgIikiOwkKCQkJCQllbHNlIHsKCQkJCQkJc3RyaW5nIHRzID0gKCppdClba107CgkJCQkJCXR2W2tdID0gIlsiICsgdHMuZXJhc2UoeCwgMSkgKyAiXSI7CgkJCQkJfQoJCQkJfQoJCQkJc3RkOjpzb3J0KHR2LmJlZ2luKCksIHR2LmVuZCgpKTsKCQkJCXN0ci5jbGVhcigpOwoJCQkJUkVQIChrLCA1KSBzdHIgKz0gdHZba107CgkJCQlhbnMuaW5zZXJ0KHN0cik7CgkJCX0KCQl9Cgl9CgkKCWZvciAoc3N0cjo6aXRlcmF0b3IgaXQgPSBhbnMuYmVnaW4oKTsgaXQgIT0gYW5zLmVuZCgpOyBpdCsrKSB7CgkJc3RkOjpjb3V0IDw8ICgqaXQpIDw8IHN0ZDo6ZW5kbDsKCX0KCQoJcmV0dXJuIDA7Cn0KCgoKc3ZzdHIgaXNDb21wbGV0ZSh2c3RyICZwYWkpIHsKCiNkZWZpbmUgRVExKHgsYSkgKCh4KT09KGEpKQojZGVmaW5lIEVRMih4LGEsYikgKEVRMSh4LGEpfHxFUTEoeCxiKSkKI2RlZmluZSBFUTMoeCxhLGIsYykgKEVRMih4LGEsYil8fEVRMSh4LGMpKQojZGVmaW5lIEVRNCh4LGEsYixjLGQpIChFUTIoeCxhLGIpfHxFUTIoeCxjLGQpKQojZGVmaW5lIEVRNSh4LGEsYixjLGQsZSkgKEVRMyh4LGEsYixjKXx8RVEyKGEsZCxlKSkKI2RlZmluZSBFUTYoeCxhLGIsYyxkLGUsZikgKEVRMyh4LGEsYixjKXx8RVEzKHgsZCxlLGYpKQojZGVmaW5lIEVRNyh4LGEsYixjLGQsZSxmLGcpIChFUTQoeCxhLGIsYyxkKXx8RVEzKHgsZSxmLGcpKQoKI2RlZmluZSBORzIoYSxiKSAoIWlzU2FtZVBhaVR3byhwYWlbYV0scGFpW2JdKSYmIWlzU2VxdWVuY2VUd28ocGFpW2FdLHBhaVtiXSkpCiNkZWZpbmUgTkczKGEsYixjKSAoIWlzU2FtZVBhaVRocmVlKHBhaVthXSxwYWlbYl0scGFpW2NdKSBcCgkJCQkJCSYmIWlzU2VxdWVuY2VUaHJlZShwYWlbYV0scGFpW2JdLHBhaVtjXSkpCgkKCXN2c3RyIHJlczsKCQoJUkVQKGoxLDE0KSB7CglSRVAoajIsMTQpIHsKCQlpZiBFUTEoajIsajEpIGNvbnRpbnVlOwoJCWlmIE5HMihqMSxqMikgY29udGludWU7CglSRVAoajMsMTQpIHsKCQlpZiBFUTIoajMsajIsajEpIGNvbnRpbnVlOwoJCWlmIE5HMyhqMSxqMixqMykgY29udGludWU7CglSRVAoajQsMTQpIHsKCQlpZiBFUTMoajQsajMsajIsajEpIGNvbnRpbnVlOwoJUkVQKGo1LDE0KSB7CgkJaWYgRVE0KGo1LGo0LGozLGoyLGoxKSBjb250aW51ZTsKCQlpZiBORzIoajQsajUpIGNvbnRpbnVlOwoJUkVQKGo2LDE0KSB7CgkJaWYgRVE1KGo2LGo1LGo0LGozLGoyLGoxKSBjb250aW51ZTsKCQlpZiBORzMoajQsajUsajYpIGNvbnRpbnVlOwoJUkVQKGo3LDE0KSB7CgkJaWYgRVE2KGo3LGo2LGo1LGo0LGozLGoyLGoxKSBjb250aW51ZTsKCVJFUChqOCwxNCkgewoJCWlmIEVRNihqOCxqNixqNSxqNCxqMyxqMixqMSkgY29udGludWU7CgkJaWYgRVExKGo4LGo3KSBjb250aW51ZTsKCQlpZiBORzIoajcsajgpIGNvbnRpbnVlOwoJUkVQKGo5LDE0KSB7CgkJaWYgRVE2KGo5LGo2LGo1LGo0LGozLGoyLGoxKSBjb250aW51ZTsKCQlpZiBFUTIoajksajgsajcpIGNvbnRpbnVlOwoJCWlmIE5HMyhqNyxqOCxqOSkgY29udGludWU7CglSRVAoajEwLDE0KSB7CgkJaWYgRVE2KGoxMCxqNixqNSxqNCxqMyxqMixqMSkgY29udGludWU7CgkJaWYgRVEzKGoxMCxqOSxqOCxqNykgY29udGludWU7CglSRVAoajExLDE0KSB7CgkJaWYgRVE2KGoxMSxqNixqNSxqNCxqMyxqMixqMSkgY29udGludWU7CgkJaWYgRVE0KGoxMSxqMTAsajksajgsajcpIGNvbnRpbnVlOwoJCWlmIE5HMihqMTAsajExKSBjb250aW51ZTsKCVJFUChqMTIsMTQpIHsKCQlpZiBFUTYoajEyLGo2LGo1LGo0LGozLGoyLGoxKSBjb250aW51ZTsKCQlpZiBFUTUoajEyLGoxMSxqMTAsajksajgsajcpIGNvbnRpbnVlOwoJCWlmIE5HMyhqMTAsajExLGoxMikgY29udGludWU7CglSRVAoajEzLDE0KSB7CgkJaWYgRVE2KGoxMyxqNixqNSxqNCxqMyxqMixqMSkgY29udGludWU7CgkJaWYgRVE2KGoxMyxqMTIsajExLGoxMCxqOSxqOCxqNykgY29udGludWU7CglSRVAoajE0LDE0KSB7CgkJaWYgRVE2KGoxNCxqNixqNSxqNCxqMyxqMixqMSkgY29udGludWU7CgkJaWYgRVE3KGoxNCxqMTMsajEyLGoxMSxqMTAsajksajgsajcpIGNvbnRpbnVlOwoJCWlmICghaXNTYW1lUGFpVHdvKHBhaVtqMTNdLCBwYWlbajE0XSkpIGNvbnRpbnVlOwoJCXZzdHIgdGUoNCk7CgkJdGVbMF0gPSBwYWlbajFdICsgcGFpW2oyXSArIHBhaVtqM107CgkJdGVbMV0gPSBwYWlbajRdICsgcGFpW2o1XSArIHBhaVtqNl07CgkJdGVbMl0gPSBwYWlbajddICsgcGFpW2o4XSArIHBhaVtqOV07CgkJdGVbM10gPSBwYWlbajEwXSArIHBhaVtqMTFdICsgcGFpW2oxMl07CgkJUkVQKGksIDQpIHsKCQkJc3RkOjpzb3J0KHRlW2ldLmJlZ2luKCksIHRlW2ldLmVuZCgpKTsKCQl9CgkJc3RkOjpzb3J0KHRlLmJlZ2luKCksIHRlLmVuZCgpKTsKCQl0ZS5wdXNoX2JhY2socGFpW2oxM10gKyBwYWlbajE0XSk7CgkJcmVzLmluc2VydCh0ZSk7Cgl9IH0gfSB9IH0KCX0gfSB9IH0gfQoJfSB9IH0gfQoJCglyZXR1cm4gcmVzOwp9CgppbnQgZ2V0UGFpTnVtYmVyKHN0cmluZyBwYWkpIHsKCXJldHVybiBzdGQ6OnN0b2kocGFpKTsKfQppbnQgaXNTYW1lUGFpVHdvKHN0cmluZyBwYWkxLCBzdHJpbmcgcGFpMikgewoJcmV0dXJuIHBhaTEuY29tcGFyZShwYWkyKSA9PSAwOwp9CmludCBpc1NhbWVQYWlUaHJlZShzdHJpbmcgcGFpMSwgc3RyaW5nIHBhaTIsIHN0cmluZyBwYWkzKSB7CglyZXR1cm4gaXNTYW1lUGFpVHdvKHBhaTEsIHBhaTIpICYmIGlzU2FtZVBhaVR3byhwYWkyLCBwYWkzKTsKfQppbnQgaXNTYW1lU3VpdFR3byhzdHJpbmcgcGFpMSwgc3RyaW5nIHBhaTIpIHsKCXJldHVybiB0cnVlOwp9CmludCBpc1NhbWVTdWl0VGhyZWUoc3RyaW5nIHBhaTEsIHN0cmluZyBwYWkyLCBzdHJpbmcgcGFpMykgewoJcmV0dXJuIGlzU2FtZVN1aXRUd28ocGFpMSwgcGFpMikgJiYgaXNTYW1lU3VpdFR3byhwYWkyLCBwYWkzKTsKfQppbnQgaXNTZXF1ZW5jZVR3byhzdHJpbmcgcGFpMSwgc3RyaW5nIHBhaTIpIHsKCXJldHVybiBpc1NhbWVTdWl0VHdvKHBhaTEsIHBhaTIpIAoJCSYmIGdldFBhaU51bWJlcihwYWkyKSAtIGdldFBhaU51bWJlcihwYWkxKSA9PSAxOwp9CmludCBpc1NlcXVlbmNlVGhyZWUoc3RyaW5nIHBhaTEsIHN0cmluZyBwYWkyLCBzdHJpbmcgcGFpMykgewoJcmV0dXJuIGlzU2VxdWVuY2VUd28ocGFpMSwgcGFpMikgJiYgaXNTZXF1ZW5jZVR3byhwYWkyLCBwYWkzKTsKfQo=