//const int N = 2e5+5;
//bool dp[N][26];
//int nxt[N][26];
//void _(){
//    string s;
//    cin >> s;
//    for(char &c : s) c -= 'a';
//    vs boxes;
//    string tmp;
//    set<char> act;
//    for(char c : s){
//        act.insert(c);
//        tmp.pb(c);
//        if(sz(act) == 26){
//            boxes.pb(tmp);
//            tmp.clear();
//            act.clear();
//        }
//    }
//    boxes.pb(tmp);
//    reverse(all(boxes));
//    int n = sz(boxes);
//    rep(i,0,25) dp[1][i] = true;
//    for(char c : boxes[0]) dp[1][c] = false;
//    rep(i,1,n-1){
//        reverse(all(boxes[i]));
//        vb banned(26);
//        for(char c : boxes[i]){
//            dp[i+1][c] = false;
//            rep(oldc,0,25){
//                if(!banned[oldc] && dp[i][oldc]){
//                    dp[i+1][c] = true;
//                    nxt[i+1][c] = oldc;
//                    break;
//                }
//            }
//            banned[c] = true;
//        }
//    }
//    int c = -1;
//    rep(i,0,25) if(dp[n][i]){
//        c = i;
//        break;
//    }
//    assert(c != -1);
//    string ans;
//    for(int i = n; i >= 1; --i){
//        ans.pb(c+'a');
//        c = nxt[i][c];
//    }
//    print(ans);
//
//}
//
#include <set>
#include <iomanip>
#include <algorithm>
#include <cassert>
#include <vector>
#include <utility>
#include <iostream>
#include <string>
#define pb push_back
#define REP_INT(i,l,r) for(int i = l; i <= r; ++i)
#define GET_REP_MACRO(_1,_2,_3,_4,NAME,...) NAME
#define rep(...) GET_REP_MACRO(__VA_ARGS__,REP_ANY,REP_INT)(__VA_ARGS__)
#define all(v) (v).begin(), (v).end()
#define sz(v) ll(v.size())
#define T1 template<typename T> static
using namespace std;
typedef long long ll;
typedef vector<bool> vb;
typedef vector<string> vs;
T1 ostream& operator<<(ostream& stream, const vector<T>& t);
T1 istream& read(T, T, istream& = cin);
T1 void print(T x, string end = "\n"){
    cout << x << end;
}
const int N = 2e5+5;
bool dp[N][26];
int nxt[N][26];
void _(){
    string s;
    cin >> s;
    for(char &c : s) c -= 'a';
    vs boxes;
    string tmp;
    set<char> act;
    for(char c : s){
        act.insert(c);
        tmp.pb(c);
        if(sz(act) == 26){
            boxes.pb(tmp);
            tmp.clear();
            act.clear();
        }
    }
    boxes.pb(tmp);
    reverse(all(boxes));
    int n = sz(boxes);
    rep(i,0,25) dp[1][i] = true;
    for(char c : boxes[0]) dp[1][c] = false;
    rep(i,1,n-1){
        reverse(all(boxes[i]));
        vb banned(26);
        for(char c : boxes[i]){
            dp[i+1][c] = false;
            rep(oldc,0,25){
                if(!banned[oldc] && dp[i][oldc]){
                    dp[i+1][c] = true;
                    nxt[i+1][c] = oldc;
                    break;
                }
            }
            banned[c] = true;
        }
    }
    int c = -1;
    rep(i,0,25) if(dp[n][i]){
        c = i;
        break;
    }
    assert(c != -1);
    string ans;
    for(int i = n; i >= 1; --i){
        ans.pb(c+'a');
        c = nxt[i][c];
    }
    print(ans);
}
int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout << fixed << setprecision(15);
        _();
}


Measured memory_bytes: 6036