#include<bits/stdc++.h>
#define S string
#define nl "\n"
#define speed ios_base::sync_with_stdio(false) , cin.tie(NULL) , cout.tie(NULL);
using namespace std;
vector<pair<int, int> >d={
{0,-1},{0,1},{1,0},{-1,0}
};
vector<char>dd={'L', 'R' , 'D' , 'U'};
const int MOD = 1e9 + 7;
const int N = 1001;
int mem[N][N]; bool vis[N][N];
int main() {
speed
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
S s;
while (getline(cin, s)) {
if (s.empty()) {
break;
}
vector<vector<S>>memo(N , vector<S>(N , ""));
memset(mem , -1 , sizeof(mem));
memset(vis , 0 , sizeof(vis));
function <int(int , int )> dp =[&](int i , int t)->int {
if (i > t)return 0;
int&res=mem[i][t];
if (~res)return res;
res = 0;
if ( i == t ) return res = 1;
if ( s[i] == s[t]) {
res = max(res ,dp( i + 1 , t - 1) + 2);
}
if (s[i] != s[t]) res = max({res , dp(i + 1 , t) , dp(i , t - 1)} );
return res;
};
function <S(int , int )> bld =[&](int i , int t)->S {
if ( vis[i][t]) return memo[i][t];
vis[i][t] = 1 ;
if (i > t)return "";
int t1 =dp(i + 1 , t) , t2 = dp(i , t - 1), t3 = 0; if (s[i] == s[t]) t3 =dp( i + 1 , t - 1 ) + 2;
int a = dp(i , t) ;
S &ans = memo[i][t];
ans = "{" ;
if ( i == t) return s.substr( i , 1) ;
if ( t3 == a) {
ans = min (ans , s.substr( i , 1) + bld(i + 1 , t - 1 ) + s.substr( i , 1));
}
if (t2 == a)ans = min ( ans , bld(i , t - 1) );
if (t1 == a) ans = min ( ans , bld(i + 1 , t ) );
return ans ;
};
dp(0 , s.size()-1 );
cout<<bld(0 , s.size()-1) << nl;
}
return 0;
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KI2RlZmluZSBTIHN0cmluZwojZGVmaW5lIG5sICJcbiIKI2RlZmluZSBzcGVlZCBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKGZhbHNlKSAsIGNpbi50aWUoTlVMTCkgLCBjb3V0LnRpZShOVUxMKTsKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKdmVjdG9yPHBhaXI8aW50LCBpbnQ+ID5kPXsKICAgIHswLC0xfSx7MCwxfSx7MSwwfSx7LTEsMH0KfTsKdmVjdG9yPGNoYXI+ZGQ9eydMJywgJ1InICwgJ0QnICwgJ1UnfTsKY29uc3QgaW50IE1PRCA9IDFlOSArIDc7CmNvbnN0IGludCBOID0gMTAwMTsKICAgaW50IG1lbVtOXVtOXTsgICBib29sIHZpc1tOXVtOXTsKCmludCBtYWluKCkgewoKICAgIHNwZWVkCgogIGZyZW9wZW4oImlucHV0LnR4dCIsICJyIiwgc3RkaW4pOwogICAgZnJlb3Blbigib3V0cHV0LnR4dCIsICJ3Iiwgc3Rkb3V0KTsKCgogICAgUyBzOwogICAgd2hpbGUgKGdldGxpbmUoY2luLCBzKSkgewogICAgICAgIGlmIChzLmVtcHR5KCkpIHsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIHZlY3Rvcjx2ZWN0b3I8Uz4+bWVtbyhOICwgdmVjdG9yPFM+KE4gLCAiIikpOwogICAgICAgICBtZW1zZXQobWVtICwgLTEgLCBzaXplb2YobWVtKSk7CiAgICAgICAgbWVtc2V0KHZpcyAsIDAgLCBzaXplb2YodmlzKSk7CgogICAgICAgIGZ1bmN0aW9uIDxpbnQoaW50ICwgaW50ICk+IGRwID1bJl0oaW50IGkgLCBpbnQgdCktPmludCB7CiAgICAgICAgICAgIGlmIChpID4gdClyZXR1cm4gMDsKICAgICAgICAgICAgaW50JnJlcz1tZW1baV1bdF07CiAgICAgICAgICAgIGlmICh+cmVzKXJldHVybiByZXM7CiAgICAgICAgICAgICAgcmVzID0gMDsKICAgICAgICAgICAgaWYgKCBpID09IHQgKSByZXR1cm4gIHJlcyA9IDE7CiAgICAgICAgICAgIGlmICggc1tpXSA9PSBzW3RdKSB7CiAgICAgICAgICAgICAgICByZXMgPSAgbWF4KHJlcyAsZHAoIGkgKyAxICwgdCAtIDEpICsgMik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHNbaV0gIT0gc1t0XSkgcmVzID0gbWF4KHtyZXMgLCBkcChpICsgMSAsIHQpICAsIGRwKGkgLCB0IC0gMSl9ICk7CiAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgfTsKCiAgICAgICAgZnVuY3Rpb24gPFMoaW50ICwgaW50ICk+IGJsZCA9WyZdKGludCBpICwgaW50IHQpLT5TIHsKICAgICAgICAgICAgaWYgKCB2aXNbaV1bdF0pIHJldHVybiBtZW1vW2ldW3RdOwogICAgICAgICAgICB2aXNbaV1bdF0gPSAxIDsKICAgICAgICAgICAgaWYgKGkgPiB0KXJldHVybiAiIjsKCiAgICAgICAgICAgIGludCB0MSA9ZHAoaSArIDEgLCB0KSAgLCAgdDIgPSBkcChpICwgdCAtIDEpLCB0MyA9IDA7ICAgaWYgKHNbaV0gPT0gc1t0XSkgdDMgPWRwKCBpICsgMSAsIHQgLSAxICkgKyAyOwogICAgICAgICAgICBpbnQgYSA9IGRwKGkgLCB0KSA7CiAgICAgICAgICAgIFMgJmFucyA9IG1lbW9baV1bdF07CiAgICAgICAgICAgICBhbnMgID0gInsiIDsKICAgICAgICAgICAgaWYgKCBpID09IHQpICAgIHJldHVybiBzLnN1YnN0ciggaSAsIDEpICAgOwogICAgICAgICAgICBpZiAoIHQzID09IGEpIHsKICAgICAgICAgICAgICAgIGFucyAgPSBtaW4gKGFucyAsIHMuc3Vic3RyKCBpICwgMSkgKyBibGQoaSArIDEgLCB0IC0gMSApICsgcy5zdWJzdHIoIGkgLCAxKSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICBpZiAodDIgPT0gYSlhbnMgPSBtaW4gKCBhbnMgLCBibGQoaSAsIHQgLSAxKSApOwogICAgICAgICAgICAgaWYgKHQxID09IGEpIGFucyA9IG1pbiAoIGFucyAsIGJsZChpICsgMSAsIHQgKSApOwoKICAgICAgICAgICAgcmV0dXJuIGFucyA7CiAgICAgICAgfTsKCgogICAgICAgIGRwKDAgLCBzLnNpemUoKS0xICk7CiAgICAgICAgY291dDw8YmxkKDAgLCBzLnNpemUoKS0xKSA8PCBubDsKICAgIH0KICAgIHJldHVybiAwOwp9