#include <iostream>
#include <cstring>
#include <set>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
string current_number;
string ansver = "";
cin >> current_number;
set<char> digits_set; // Инициализируем и заполняем множество со всеми цифрами начального числа
for (int i = 0; i < current_number.size(); i++){
char element = current_number[i];
digits_set.insert(element);
}
std::vector<char> digits;
for (char i : digits_set){
digits.push_back(i);
}
std::reverse(digits.begin(), digits.end()); // Располагаем цифры в порядке убывания
while (digits.size() != 1){ // Повторяем, пока не нашли все цифры кроме последней
for (int i=0; i < digits.size(); i++){ // Перебираем цифры в порядке убывания
char local_max = digits[i];
int position = current_number.find(local_max);
string new_number;
for (int j = position; j < current_number.size(); j++){ // Делаем срез по элементу
new_number += current_number[j];
}
set<char> digits_on_the_right;
for (int j = 0; j < new_number.size(); j++){ // Находим цифры нового числа
digits_on_the_right.insert(new_number[j]);
}
if (digits.size() == digits_on_the_right.size()){ // Проверяем, сохранится ли ранг ответа
ansver += local_max;
digits.erase(digits.begin() + i);
string number_without_digit = "";
for (int t = 0; t < new_number.size(); t++){ // Удаляем добавленную в ответ цифру из числа
if (new_number[t] != local_max){
number_without_digit += new_number[t];
}
}
current_number = number_without_digit;
break; // Останавливаем цикл, т.к. необходимая цифра на позицию уже найдена
}
}
}
cout << ansver + digits[0]; // Добавляем к ответу последнюю оставшуюся цифру
return 0;
}