#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> ii;
const int N = 2e3 + 5;
int n;
string s;
int dp[N][N]; // dp[i][j]: là độ dài của xâu con đối xứng dài nhất khi xét đoạn [i..j] của xâu s
// đáp án: dp[1][n]
// l e v e l
// i i+1 j-1 j
int memo[N][N];
int f(int i, int j) {
if (i > j) return 0;
if (i == j) return 1;
int& ans = memo[i][j];
if (ans != -1) return ans;
if (s[i] == s[j]) {
ans = 2 + f(i + 1, j - 1);
}
else {
ans = max(f(i + 1, j), f(i, j - 1));
}
return ans;
}
void trace(int i, int j) {
if (i > j) return;
if (i == j) {
cout << s[i];
return;
}
if (s[i] == s[j]) {
cout << s[i];
trace(i + 1, j - 1);
cout << s[j];
}
else {
if (f(i + 1, j) > f(i, j - 1)) {
trace(i + 1, j);
}
else {
trace(i, j - 1);
}
}
}
int main() {
ios::sync_with_stdio(0); cin.tie(0);
cin >> s;
n = s.size();
s = ' ' + s;
// thứ tự vòng for sẽ dựa vào công thức truy hồi!
// for (int i = n; i >= 1; i--) {
// for (int j = i; j <= n; j++) {
// if (i == j) {
// dp[i][j] = 1;
// continue;
// }
// if (s[i] == s[j]) {
// dp[i][j] = dp[i + 1][j - 1] + 2; // xâu con đối xứng của đoạn [i+1][j-1] bổ sung thêm 2 kí tự vào 2 đầu
// }
// else { // s[i] != s[j]
// dp[i][j] = max(dp[i + 1][j], dp[i][j - 1]); // xét trường hợp bỏ đi kí tự i hoặc bỏ đi kí tự j
// }
// }
// }
// cout << dp[1][n] << '\n';
memset(memo, -1, sizeof memo);
trace(1, n);
cout << '\n';
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+IAp1c2luZyBuYW1lc3BhY2Ugc3RkOyAgCgp0eXBlZGVmIGxvbmcgbG9uZyBsbDsgIAp0eXBlZGVmIHBhaXI8aW50LCBpbnQ+IGlpOyAgCgpjb25zdCBpbnQgTiA9IDJlMyArIDU7ICAKCmludCBuOyAgCnN0cmluZyBzOyAgCmludCBkcFtOXVtOXTsgLy8gZHBbaV1bal06IGzDoCDEkeG7mSBkw6BpIGPhu6dhIHjDonUgY29uIMSR4buRaSB44bupbmcgZMOgaSBuaOG6pXQga2hpIHjDqXQgxJFv4bqhbiBbaS4ual0gY+G7p2EgeMOidSBzIAoKLy8gxJHDoXAgw6FuOiBkcFsxXVtuXSAKCi8vIGwgICBlICAgIHYgICAgIGUgICBsICAgICAKLy8gaSAgaSsxICAgICAgICBqLTEgIGoKCmludCBtZW1vW05dW05dOyAgIAoKaW50IGYoaW50IGksIGludCBqKSB7CglpZiAoaSA+IGopIHJldHVybiAwOyAgIAoJaWYgKGkgPT0gaikgcmV0dXJuIDE7ICAgCgoJaW50JiBhbnMgPSBtZW1vW2ldW2pdOyAgICAKCWlmIChhbnMgIT0gLTEpIHJldHVybiBhbnM7ICAgCgoJaWYgKHNbaV0gPT0gc1tqXSkgewoJCWFucyA9IDIgKyBmKGkgKyAxLCBqIC0gMSk7ICAgCgl9CgllbHNlIHsKCQlhbnMgPSBtYXgoZihpICsgMSwgaiksIGYoaSwgaiAtIDEpKTsgCgl9CgoJcmV0dXJuIGFuczsgIAp9Cgp2b2lkIHRyYWNlKGludCBpLCBpbnQgaikgewoJaWYgKGkgPiBqKSByZXR1cm47ICAgCgoJaWYgKGkgPT0gaikgewoJCWNvdXQgPDwgc1tpXTsgCgkJcmV0dXJuOyAKCX0KCglpZiAoc1tpXSA9PSBzW2pdKSB7CgkJY291dCA8PCBzW2ldOyAKCQl0cmFjZShpICsgMSwgaiAtIDEpOyAgCgkJY291dCA8PCBzW2pdOyAKCX0KCWVsc2UgewoJCWlmIChmKGkgKyAxLCBqKSA+IGYoaSwgaiAtIDEpKSB7CgkJCXRyYWNlKGkgKyAxLCBqKTsgCgkJfQoJCWVsc2UgewoJCQl0cmFjZShpLCBqIC0gMSk7IAoJCX0KCX0KfQoKaW50IG1haW4oKSB7Cglpb3M6OnN5bmNfd2l0aF9zdGRpbygwKTsgY2luLnRpZSgwKTsgIAkKCWNpbiA+PiBzOyAKCW4gPSBzLnNpemUoKTsgIAoKCXMgPSAnICcgKyBzOyAgCgoJLy8gdGjhu6kgdOG7sSB2w7JuZyBmb3Igc+G6vSBk4buxYSB2w6BvIGPDtG5nIHRo4bupYyB0cnV5IGjhu5NpIQoJLy8gZm9yIChpbnQgaSA9IG47IGkgPj0gMTsgaS0tKSB7CgkvLyAJZm9yIChpbnQgaiA9IGk7IGogPD0gbjsgaisrKSB7CgkvLyAJCWlmIChpID09IGopIHsKCS8vIAkJCWRwW2ldW2pdID0gMTsgIAoJLy8gCQkJY29udGludWU7ICAKCS8vIAkJfQoJLy8gCQlpZiAoc1tpXSA9PSBzW2pdKSB7CgkvLyAJCQlkcFtpXVtqXSA9IGRwW2kgKyAxXVtqIC0gMV0gKyAyOyAvLyB4w6J1IGNvbiDEkeG7kWkgeOG7qW5nIGPhu6dhIMSRb+G6oW4gW2krMV1bai0xXSBi4buVIHN1bmcgdGjDqm0gMiBrw60gdOG7sSB2w6BvIDIgxJHhuqd1CgkvLyAJCX0KCS8vIAkJZWxzZSB7IC8vIHNbaV0gIT0gc1tqXQoJLy8gCQkJZHBbaV1bal0gPSBtYXgoZHBbaSArIDFdW2pdLCBkcFtpXVtqIC0gMV0pOyAvLyB4w6l0IHRyxrDhu51uZyBo4bujcCBi4buPIMSRaSBrw60gdOG7sSBpIGhv4bq3YyBi4buPIMSRaSBrw60gdOG7sSBqIAoJLy8gCQl9CgkvLyAJfQoJLy8gfQoKCS8vIGNvdXQgPDwgZHBbMV1bbl0gPDwgJ1xuJzsgCgoJbWVtc2V0KG1lbW8sIC0xLCBzaXplb2YgbWVtbyk7ICAKCQoJdHJhY2UoMSwgbik7IAoJCgljb3V0IDw8ICdcbic7IAp9Cg==