import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String line = reader.readLine();
line = stage1(line);
line = stage2(line);
line = stage3(line);
System.out.println(line);
}
// 第一步:将输入的两个字符串str1和str2进行前后合并。
public static String stage1(String line) {
return line.replace(" ", "");
}
// 第二步:对合并后的字符串进行排序,要求为:下标为奇数的字符和下标为偶数的字符分别从小到大排序。
public static String stage2(String line) {
int length = line.length();
char[] evens = new char[length % 2 == 0 ? length / 2 : length / 2 + 1];
char[] odds = new char[length / 2];
for (int i = 0; i < length; ++i) {
if (i % 2 == 0) {
evens[i / 2] = line.charAt(i);
} else {
odds[i / 2] = line.charAt(i);
}
}
Arrays.sort(evens);
Arrays.sort(odds);
char[] merge = new char[length];
for (int i = 0; i < merge.length; ++i) {
if (i % 2 == 0) {
merge[i] = evens[i / 2];
} else {
merge[i] = odds[i / 2];
}
}
return new String(merge);
}
/**
* 第三步:对排序后的字符串中的'0'~'9'、'A'~'F'和'a'~'f'字符,需要进行转换操作。
* 转换规则@see translate
*/
public static String stage3(String line) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < line.length(); ++i) {
sb.append(translate(line.charAt(i)));
}
return sb.toString();
}
// 转换规则如下:
// 对以上需要进行转换的字符所代表的十六进制用二进制表示并倒序;
// 然后再转换成对应的十六进制大写字符(注:字符 a~f 的十六进制对应十进制的10~15,大写同理)。
public static char translate(char ascii) {
if (ascii >= 'a' && ascii <= 'f') {
return Character.toUpperCase(Character.forDigit(transform(ascii), 16));
}
if (ascii >= 'A' && ascii <= 'F') {
return Character.toUpperCase(Character.forDigit(transform(ascii), 16));
}
if (ascii >= '0' && ascii <= '9') {
return Character.toUpperCase(Character.forDigit(transform(ascii), 16));
}
return ascii;
}
private static int transform(char ascii) {
int x = Character.digit(ascii, 16);
int r = 0;
for (int i = 0; i < 4; ++i) {
r |= (x & 0x01);
x >>= 1;
if (i < 3) r <<= 1;
}
return r;
}
}