#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int location, temp_max;
int KMP(string S, string K){
vector<int> T(K.size()+1, -1);
//prepare partial match table
for(int i = 1; i <= K.size(); i++){
int pos = T[i-1];
while(pos != -1 && K[pos] != K[i-1]) pos = T[pos];
T[i] = pos + 1;
}
int sp = 0, kp = 0,temp = 0;
temp_max = 0, location = 0;
//actual KMP algorithm
while(sp < S.size()){
while(kp != -1 && (kp == K.size() || K[kp] != S[sp])) kp = T[kp];
kp++;
sp++;
temp = kp;
if(temp > temp_max){ location = sp-temp_max-1; temp_max = temp; }//cout << location<<","<<temp_max<<"\t";}
}
//location = S.size()-temp_max ;
//cout<<"location = "<<location<<"\n";
return location;
}
int main() {
// your code goes here
string s, rev_s;
int x,temporary;
while(!cin.eof()){
cin >> s;
string right,left,temp1,temp2;
rev_s.resize(s.size());
reverse_copy(s.begin(), s.end(), rev_s.begin());
//cout<<s<<endl;
//cout<<rev_s<<endl;
x = 0;
x = KMP(s, rev_s);
if(x == s.size()){
cout<<s<<endl;
}
else{
//cout << location << "\t" << temp_max <<"\t"<<s.size() <<"\n";
temporary = s.size();
left.resize(temporary);
right.resize(temporary);
temp1.resize(temporary);
temp2.resize(temporary);
if(location+temp_max < temporary){
if(location == 0)
{
reverse_copy(s.begin(),s.end()-temp_max,right.begin());
cout<<s<<right<<"\n";
}
else if(location != 0)
{
reverse_copy(s.begin()+location,s.begin()+location+temp_max,temp1.begin());
copy(s.begin()+location,s.begin()+location+temp_max,temp2.begin());
if(equal(temp1.begin(),temp1.end(),temp2.begin()))
{
//if end part is palindrome itself
//cout<<temp1<<"\t"<<temp2<<"\n";
//cout<<"working";
reverse_copy(s.begin(),s.end()-temp_max,right.begin());
cout<<s<<right<<"\n";
}
else
{
reverse_copy(s.begin(),s.end()-1,right.begin());
cout<<s<<right<<"\n";
}
}
}
else
{
s.resize(s.size()+x);
reverse_copy(s.begin(),s.begin()+x, s.begin()+temporary);
cout<<s<<"\n";
}
}
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8YWxnb3JpdGhtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKaW50IGxvY2F0aW9uLCB0ZW1wX21heDsKaW50IEtNUChzdHJpbmcgUywgc3RyaW5nIEspewoJdmVjdG9yPGludD4gVChLLnNpemUoKSsxLCAtMSk7CgkKCS8vcHJlcGFyZSBwYXJ0aWFsIG1hdGNoIHRhYmxlCglmb3IoaW50IGkgPSAxOyBpIDw9IEsuc2l6ZSgpOyBpKyspewoJCWludCBwb3MgPSBUW2ktMV07CgkJd2hpbGUocG9zICE9IC0xICYmIEtbcG9zXSAhPSBLW2ktMV0pIHBvcyA9IFRbcG9zXTsKCQlUW2ldID0gcG9zICsgMTsKCX0KCQoJaW50IHNwID0gMCwga3AgPSAwLHRlbXAgPSAwOwoJdGVtcF9tYXggPSAwLCBsb2NhdGlvbiA9IDA7CgkKCS8vYWN0dWFsIEtNUCBhbGdvcml0aG0KCXdoaWxlKHNwIDwgUy5zaXplKCkpewoJCXdoaWxlKGtwICE9IC0xICYmIChrcCA9PSBLLnNpemUoKSB8fCBLW2twXSAhPSBTW3NwXSkpIGtwID0gVFtrcF07CgkJa3ArKzsKCQlzcCsrOwoJCXRlbXAgPSBrcDsgCgkJaWYodGVtcCA+IHRlbXBfbWF4KXsgbG9jYXRpb24gPSBzcC10ZW1wX21heC0xOyB0ZW1wX21heCA9IHRlbXA7IH0vL2NvdXQgPDwgbG9jYXRpb248PCIsIjw8dGVtcF9tYXg8PCJcdCI7fQoJfQoJLy9sb2NhdGlvbiA9IFMuc2l6ZSgpLXRlbXBfbWF4IDsKCS8vY291dDw8ImxvY2F0aW9uID0gIjw8bG9jYXRpb248PCJcbiI7CglyZXR1cm4gbG9jYXRpb247Cn0KCmludCBtYWluKCkgewoJLy8geW91ciBjb2RlIGdvZXMgaGVyZQoJc3RyaW5nIHMsIHJldl9zOwoJaW50IHgsdGVtcG9yYXJ5OwoJd2hpbGUoIWNpbi5lb2YoKSl7CgkJY2luID4+IHM7CgkJc3RyaW5nIHJpZ2h0LGxlZnQsdGVtcDEsdGVtcDI7CgkJcmV2X3MucmVzaXplKHMuc2l6ZSgpKTsKCQlyZXZlcnNlX2NvcHkocy5iZWdpbigpLCBzLmVuZCgpLCByZXZfcy5iZWdpbigpKTsKCQkvL2NvdXQ8PHM8PGVuZGw7CgkJLy9jb3V0PDxyZXZfczw8ZW5kbDsKCQl4ID0gMDsKCQl4ID0gS01QKHMsIHJldl9zKTsKCQlpZih4ID09IHMuc2l6ZSgpKXsKCQkJY291dDw8czw8ZW5kbDsKCQl9CgkJZWxzZXsKCQkJLy9jb3V0IDw8IGxvY2F0aW9uIDw8ICJcdCIgPDwgdGVtcF9tYXggPDwiXHQiPDxzLnNpemUoKSA8PCJcbiI7CgkJCXRlbXBvcmFyeSA9IHMuc2l6ZSgpOwoJCQlsZWZ0LnJlc2l6ZSh0ZW1wb3JhcnkpOwoJCQlyaWdodC5yZXNpemUodGVtcG9yYXJ5KTsKCQkJdGVtcDEucmVzaXplKHRlbXBvcmFyeSk7CgkJCXRlbXAyLnJlc2l6ZSh0ZW1wb3JhcnkpOwoJCQlpZihsb2NhdGlvbit0ZW1wX21heCA8IHRlbXBvcmFyeSl7CgkJCQlpZihsb2NhdGlvbiA9PSAwKQoJCQkJewoJCQkJCXJldmVyc2VfY29weShzLmJlZ2luKCkscy5lbmQoKS10ZW1wX21heCxyaWdodC5iZWdpbigpKTsJCgkJCQkJY291dDw8czw8cmlnaHQ8PCJcbiI7CgkJCQl9CgkJCQllbHNlIGlmKGxvY2F0aW9uICE9IDApCgkJCQl7CgkJCQkJcmV2ZXJzZV9jb3B5KHMuYmVnaW4oKStsb2NhdGlvbixzLmJlZ2luKCkrbG9jYXRpb24rdGVtcF9tYXgsdGVtcDEuYmVnaW4oKSk7CgkJCQkJY29weShzLmJlZ2luKCkrbG9jYXRpb24scy5iZWdpbigpK2xvY2F0aW9uK3RlbXBfbWF4LHRlbXAyLmJlZ2luKCkpOwoJCQkJCWlmKGVxdWFsKHRlbXAxLmJlZ2luKCksdGVtcDEuZW5kKCksdGVtcDIuYmVnaW4oKSkpCgkJCQkJewoJCQkJCQkvL2lmIGVuZCBwYXJ0IGlzIHBhbGluZHJvbWUgaXRzZWxmCgkJCQkJCS8vY291dDw8dGVtcDE8PCJcdCI8PHRlbXAyPDwiXG4iOwoJCQkJCQkvL2NvdXQ8PCJ3b3JraW5nIjsKCQkJCQkJcmV2ZXJzZV9jb3B5KHMuYmVnaW4oKSxzLmVuZCgpLXRlbXBfbWF4LHJpZ2h0LmJlZ2luKCkpOwoJCQkJCQljb3V0PDxzPDxyaWdodDw8IlxuIjsKCQkJCQl9CgkJCQkJZWxzZQoJCQkJCXsKCQkJCQkJcmV2ZXJzZV9jb3B5KHMuYmVnaW4oKSxzLmVuZCgpLTEscmlnaHQuYmVnaW4oKSk7CgkJCQkJCWNvdXQ8PHM8PHJpZ2h0PDwiXG4iOwoJCQkJCX0KCQkJCX0KCQkJfQoJCQllbHNlCgkJCXsKCQkJCXMucmVzaXplKHMuc2l6ZSgpK3gpOwoJCQkJcmV2ZXJzZV9jb3B5KHMuYmVnaW4oKSxzLmJlZ2luKCkreCwgcy5iZWdpbigpK3RlbXBvcmFyeSk7CgkJCQljb3V0PDxzPDwiXG4iOwoJCQl9CgkJfQoJfQoJcmV0dXJuIDA7Cn0=