#include <iostream>
#include <cassert>
#include <algorithm>
#include <array>
#include <string>
#include <unordered_map>
#include <chrono>
 
// S('t' "alpha" 'h')
std::string palindrome(const std::string& s) {
    // so slow ... trying to search in cache
    static std::unordered_map<std::string, std::string> cache;
    if (cache.find(s) != end(cache)) {
        return cache[s];
    }
    //////////////////////////////////////////
    if (s.size() == 0 || s.size() == 1) {
        return s;
    }
    std::string alpha{ s.substr(1, s.size() - 2) };
    if (s.front() == s.back()) {
        std::string result = s.front() + palindrome(alpha) + s.back();
        cache[s] = result;
        return result;
    }
    std::array<std::string, 3> branches;
    // S(alpha t)
    std::string alpha_t{ s.substr(1) };
    branches[0] = palindrome(alpha_t);
    if (branches[0].size() == alpha_t.size()) {
        cache[s] = branches[0];
        return branches[0];
    }
    // S(h alpha)
    std::string h_alpha{ s.substr(0, s.size() - 1) };
    branches[1] = palindrome(h_alpha);
    if (branches[1].size() == h_alpha.size()) {
        cache[s] = branches[1];
        return branches[1];
    }
    // S(alpha)
    branches[2] = palindrome(alpha);
 
    auto result = std::max_element(branches.begin(), branches.end(), []
    (const std::string& a, const std::string& b) {
        return a.size() < b.size();
    }); 
    
    cache[s] = *result;
    return *result;
}
int main()
{
	std::ios_base::sync_with_stdio(false);
	std::string str;
	std::cin>>str;
	std::cout<<palindrome(str);
}