#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] = Độ 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
// 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(false);
cin.tie(nullptr);
cin >> s;
n = s.size();
s = ' ' + s;
// thứ tự và chiều duyệt (xuôi/ngược) của 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);
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+IAoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsgIAoKdHlwZWRlZiBsb25nIGxvbmcgbGw7ICAKdHlwZWRlZiBwYWlyPGludCwgaW50PiBpaTsgIAoKY29uc3QgaW50IE4gPSAyZTMgKyA1OyAgCgppbnQgbjsgIApzdHJpbmcgczsgIAppbnQgZHBbTl1bTl07IC8vIGRwW2ldW2pdID0gxJDhu5kgZMOgaSBj4bunYSB4w6J1IGNvbiDEkeG7kWkgeOG7qW5nIGTDoGkgbmjhuqV0IGtoaSB4w6l0IMSRb+G6oW4gW2kuLmpdIGPhu6dhIHjDonUgcyAKCi8vIGwgICBlICAgIHYgICAgIGUgICBsICAgICAKLy8gaSAgaSsxICAgICAgICBqLTEgIGoKCmludCBtZW1vW05dW05dOyAgIAoKaW50IGYoaW50IGksIGludCBqKSB7CglpZiAoaSA+IGopIHJldHVybiAwOyAgIAoJaWYgKGkgPT0gaikgcmV0dXJuIDE7ICAgCgoJaW50JiBhbnMgPSBtZW1vW2ldW2pdOyAgICAKCWlmIChhbnMgIT0gLTEpIHJldHVybiBhbnM7ICAgCgoJaWYgKHNbaV0gPT0gc1tqXSkgewoJCWFucyA9IDIgKyBmKGkgKyAxLCBqIC0gMSk7ICAgCgl9CgllbHNlIHsKCQlhbnMgPSBtYXgoZihpICsgMSwgaiksIGYoaSwgaiAtIDEpKTsgCgl9CgoJcmV0dXJuIGFuczsgIAp9Cgp2b2lkIHRyYWNlKGludCBpLCBpbnQgaikgewoJaWYgKGkgPiBqKSByZXR1cm47ICAgCgoJaWYgKGkgPT0gaikgewoJCWNvdXQgPDwgc1tpXTsgCgkJcmV0dXJuOyAKCX0KCglpZiAoc1tpXSA9PSBzW2pdKSB7CgkJY291dCA8PCBzW2ldOyAKCQl0cmFjZShpICsgMSwgaiAtIDEpOyAgCgkJY291dCA8PCBzW2pdOyAKCX0KCWVsc2UgewoJCWlmIChmKGkgKyAxLCBqKSA+IGYoaSwgaiAtIDEpKSB7CgkJCXRyYWNlKGkgKyAxLCBqKTsgCgkJfQoJCWVsc2UgewoJCQl0cmFjZShpLCBqIC0gMSk7IAoJCX0KCX0KfQoKaW50IG1haW4oKSB7Cglpb3M6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7CgljaW4udGllKG51bGxwdHIpOyAgCQoJY2luID4+IHM7IAoJbiA9IHMuc2l6ZSgpOyAgCgoJcyA9ICcgJyArIHM7ICAKCgkvLyB0aOG7qSB04buxIHbDoCBjaGnhu4F1IGR1eeG7h3QgKHh1w7RpL25nxrDhu6NjKSBj4bunYSB2w7JuZyBmb3Igc+G6vSBk4buxYSB2w6BvIGPDtG5nIHRo4bupYyB0cnV5IGjhu5NpIQoJLy8gZm9yIChpbnQgaSA9IG47IGkgPj0gMTsgaS0tKSB7CgkvLyAJZm9yIChpbnQgaiA9IGk7IGogPD0gbjsgaisrKSB7CgkvLyAJCWlmIChpID09IGopIHsKCS8vIAkJCWRwW2ldW2pdID0gMTsgIAoJLy8gCQkJY29udGludWU7ICAKCS8vIAkJfQoJLy8gCQlpZiAoc1tpXSA9PSBzW2pdKSB7CgkvLyAJCQlkcFtpXVtqXSA9IGRwW2kgKyAxXVtqIC0gMV0gKyAyOyAvLyB4w6J1IGNvbiDEkeG7kWkgeOG7qW5nIGPhu6dhIMSRb+G6oW4gW2krMS4uai0xXSBi4buVIHN1bmcgdGjDqm0gMiBrw60gdOG7sSB2w6BvIDIgxJHhuqd1CgkvLyAJCX0KCS8vIAkJZWxzZSB7IC8vIHNbaV0gIT0gc1tqXQoJLy8gCQkJZHBbaV1bal0gPSBtYXgoZHBbaSArIDFdW2pdLCBkcFtpXVtqIC0gMV0pOyAvLyB4w6l0IHRyxrDhu51uZyBo4bujcCBi4buPIMSRaSBrw60gdOG7sSBpIGhv4bq3YyBi4buPIMSRaSBrw60gdOG7sSBqIAoJLy8gCQl9CgkvLyAJfQoJLy8gfQoKCS8vIGNvdXQgPDwgZHBbMV1bbl0gPDwgJ1xuJzsgCgoJbWVtc2V0KG1lbW8sIC0xLCBzaXplb2YgbWVtbyk7ICAKCQoJdHJhY2UoMSwgbik7IAp9Cg==