#include <bits/stdc++.h>
using namespace std;
//思路:1、分割字符串:遇到非英文的其他字符则分割;2、把子字符串放入set容器自动排序
//思路:开辟一个26长度的数组空间表示26位字母出现次数;从头开始遍历即实现按顺序输出;将字母按顺序存入之后即可直接替换原字符串。
int main() {
    string s;
    vector<char> vec;
    getline(cin,s);
    for(int i=0;i<26;i++){//i从A开始遍历26个字母,即在字符串中从a/A开始找,如果找到的话则放入vec
        for(int j=0;j<s.length();j++){//从字符串的开头开始找到末尾,即使字母相同也可以按顺序存放
            if(s[j]-'a'==i||s[j]-'A'==i){//字符-‘a’即为小写字母的ASCII码,字符-'A'为大写字母的Ascii码
                vec.push_back(s[j]);
            }
        }
    }
    int j=0;
    for(int i=0;i<s.length();i++){
        if((s[i]<='z'&&s[i]>='a')||(s[i]<='Z'&&s[i]>='A'))
            s[i]=vec[j++];//如果是字母的话,则替换vec中排好顺序的字符,其他不变
    }
    cout<<s;
    
    
}
// 64 位输出请用 printf("%lld")