#include<bits/stdc++.h>
using namespace std;
const int mn=1e4+9;
long long dp[mn],pre[mn],len;
//dp[i]表以第i个人的名字为结尾的最长上升子序列
//pre[i]表示这个序列中第i个人的前面应该是第pre[i]这个人
string s,a[mn];
//a[i]表以第i个人的名字
int main(){
/---伪动规---\
["Alice","Bob","Amy","Tom"]
i=3 Amy , j=1 Alice
Alice < Amy
dp[3] < dp[1]+1
dp[3]=dp[i]+1
pre[3]=1
\------------/
cin>>s;
for(int i=0;i<s.size();i++){
if(s[i]>='A'&&s[i]<='Z'){
len++;
//存大写字母进a数组
a[len]=s[i];
}
else{
//存小写字母
a[len]+=s[i];
}
}
for(int i=1;i<=len;i++){
dp[i]=1;//自己一个人
pre[i]=0;
for(int j=1;j<i;j++){
if(a[i]>a[j]){
// AliceAmy
// a[i]要拼接在a[j]的后面
// 最长上升子序列
if(dp[i]<dp[j]+1){//之前的长度更短(的话)
pre[i]=j;//更新i的前一个人是谁
dp[i]=dp[j]+1;//更新长度
}
else if(dp[i]>dp[j]+1){
//之前长度更长,不需要操作
}
else if(dp[i]dp[j]+1){
//记录字典序最小的
//之前的名字:a[pre[i]]
//本次的名字:a[j]
if(a[j]<a[pre[i]]){
pre[i]=j;//更新i的前一个人是谁
}
}
}
}
}
int L=0,ed=0;
// L:最大长度 ed:最大长度的结束的下标
for(int i=1;i<=len;i++){
if(L<dp[i]){
L=dp[i];
ed=i;
}
else if(Ldp[i]){
//记录字典序最小的
if(a[i]<a[ed]){
ed=i;//更新最大长度结束的下标
}
}
}
string ans="";
while(ed){
//∵每个人只知道前一个人是谁
//∴从终点开始往前找
ans=a[ed]+ans;
ed=pre[ed];
}
cout<<ans;
return 0;
}