/*
Cred : SunnyYeahBoi
It's my last chance (⌐■_■)
Problem :
*/
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define double long double
#define endl "\n"
#define NAME "a"
const int MAXN = 2e3 + 5;
const int inf = 1e18;
const int MOD = 1e9 + 7;
void FileInput(){
if(fopen(NAME".inp" , "r") == NULL)
freopen(NAME".inp" , "w" , stdout);
freopen(NAME".inp" , "r" , stdin);
freopen(NAME".out" , "w" , stdout);
}
int n;
string s;
int dp[MAXN][MAXN];
string trace(int L , int R){
if(L > R) return "";
if(s[L] == s[R]){
if(L == R){
string t = "";
t += s[L];
return t;
}
string t = trace(L + 1 , R - 1);
return s[L] + t + s[R];
}
if(dp[L + 1][R] > dp[L][R - 1])
return trace(L + 1 , R);
return trace(L , R - 1);
}
void solve(){
cin >> s;
n = s.size();
s = '*' + s;
for(int len = 1 ; len <= n ; len++){
for(int L = 1 ; L + len - 1 <= n ; L++){
int R = L + len - 1;
if(R - L + 1 == 1)
dp[L][R] = 1;
else{
if(s[L] == s[R])
dp[L][R] = dp[L + 1][R - 1] + 2;
else dp[L][R] = max(dp[L + 1][R] , dp[L][R - 1]);
}
}
}
cout << trace(1 , n) << endl;
}
int32_t main(){
//FileInput();
ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
int t = 1;
// cin >> t;
while(t--)
solve();
return 0;
}
LyoKICAgIENyZWQgOiBTdW5ueVllYWhCb2kKICAgIEl0J3MgbXkgbGFzdCBjaGFuY2UgKOKMkOKWoF/ilqApCiAgICBQcm9ibGVtIDoKKi8KCiNpbmNsdWRlPGJpdHMvc3RkYysrLmg+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKI2RlZmluZSBpbnQgbG9uZyBsb25nCiNkZWZpbmUgZG91YmxlIGxvbmcgZG91YmxlCiNkZWZpbmUgZW5kbCAiXG4iCiNkZWZpbmUgTkFNRSAiYSIKCmNvbnN0IGludCBNQVhOID0gMmUzICsgNTsKY29uc3QgaW50IGluZiA9IDFlMTg7CmNvbnN0IGludCBNT0QgPSAxZTkgKyA3OwoKdm9pZCBGaWxlSW5wdXQoKXsKICAgIGlmKGZvcGVuKE5BTUUiLmlucCIgLCAiciIpID09IE5VTEwpCiAgICAgICAgZnJlb3BlbihOQU1FIi5pbnAiICwgInciICwgc3Rkb3V0KTsKICAgIGZyZW9wZW4oTkFNRSIuaW5wIiAsICJyIiAsIHN0ZGluKTsKICAgIGZyZW9wZW4oTkFNRSIub3V0IiAsICJ3IiAsIHN0ZG91dCk7Cn0KCmludCBuOwpzdHJpbmcgczsKaW50IGRwW01BWE5dW01BWE5dOwoKc3RyaW5nIHRyYWNlKGludCBMICwgaW50IFIpewogICAgaWYoTCA+IFIpIHJldHVybiAiIjsKICAgIAogICAgaWYoc1tMXSA9PSBzW1JdKXsKICAgICAgICBpZihMID09IFIpewogICAgICAgICAgICBzdHJpbmcgdCA9ICIiOwogICAgICAgICAgICB0ICs9IHNbTF07CiAgICAgICAgICAgIHJldHVybiB0OwogICAgICAgIH0KICAgICAgICBzdHJpbmcgdCA9IHRyYWNlKEwgKyAxICwgUiAtIDEpOwogICAgICAgIHJldHVybiBzW0xdICsgdCArIHNbUl07CiAgICB9CgogICAgaWYoZHBbTCArIDFdW1JdID4gZHBbTF1bUiAtIDFdKSAKICAgICAgICByZXR1cm4gdHJhY2UoTCArIDEgLCBSKTsKICAgIHJldHVybiB0cmFjZShMICwgUiAtIDEpOwp9Cgp2b2lkIHNvbHZlKCl7CiAgICBjaW4gPj4gczsKICAgIG4gPSBzLnNpemUoKTsKICAgIHMgPSAnKicgKyBzOwoKICAgIAogICAgZm9yKGludCBsZW4gPSAxIDsgbGVuIDw9IG4gOyBsZW4rKyl7CiAgICAgICAgZm9yKGludCBMID0gMSA7IEwgKyBsZW4gLSAxIDw9IG4gOyBMKyspewogICAgICAgICAgICBpbnQgUiA9IEwgKyBsZW4gLSAxOwogICAgICAgICAgICBpZihSIC0gTCArIDEgPT0gMSkKICAgICAgICAgICAgICAgIGRwW0xdW1JdID0gMTsKICAgICAgICAgICAgZWxzZXsKICAgICAgICAgICAgICAgIGlmKHNbTF0gPT0gc1tSXSkKICAgICAgICAgICAgICAgICAgICBkcFtMXVtSXSA9IGRwW0wgKyAxXVtSIC0gMV0gKyAyOwogICAgICAgICAgICAgICAgZWxzZSBkcFtMXVtSXSA9IG1heChkcFtMICsgMV1bUl0gLCBkcFtMXVtSIC0gMV0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKCiAgICBjb3V0IDw8IHRyYWNlKDEgLCBuKSA8PCBlbmRsOwp9CgppbnQzMl90IG1haW4oKXsKICAgIC8vRmlsZUlucHV0KCk7CiAgICBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKDApO2Npbi50aWUoMCk7Y291dC50aWUoMCk7CiAgICBpbnQgdCA9IDE7CiAgICAvLyBjaW4gPj4gdDsKICAgIHdoaWxlKHQtLSkKICAgICAgICBzb2x2ZSgpOwogICAgcmV0dXJuIDA7Cn0K