#include <bits/stdc++.h>
using namespace std;
#define ld long double
#define F first
#define S second
#define Lnode 2*node+1
#define Rnode 2*node+2
#define MID (l+r>>1)
#define el '\n'
#define coutf(x) for(auto v:(x)) cout<<v<<' '; cout<<el
#define coutp(x) for(auto v:(x)) cout<<v.F<<' '<<v.S<<el
#define cinl(x) for(auto &v:(x)) cin>>v;
#define all(x)  x.begin(),x.end()
#define ll long long
#define sz(x)  (int)x.size()
#define pi pair<ll,ll>
#define pii pair<ll,pair<ll,ll>>
#define vi vector<ll>
using ull = unsigned long long;
vector<int>lcp (const string& s)
{
    int n=s.size();
    vector<int>phi(n,0);
    for (int i=1,k=0;i<n;i++)
    {
        k=phi[i-1];
        while (k>0&&s[i]!=s[k])k=phi[k-1];
        if (s[i]==s[k])k++;
        phi[i]=k;
    }
    return phi;

}

pi mancher(const string&s)
{
    int c=0,r=0;
    string t="#";
    for (auto it:s)t+=it,t+="#";
    // for (auto it:t)cout<<it<<" ";
    int n=t.size();
    vector<int>p(n,0);
    for (int i=0;i<n;i++){
        if (i<r)
        {
            int miror = 2*c-i;
            p[i]=min(r-i,p[miror]);
        }
        int left=i-p[i]-1;
        int right=i+p[i]+1;
        while (left>=0&&right<n&&t[left]==t[right])right++,left--,p[i]++;
        if (i+p[i]>r)r=i+p[i],c=i;
    }
    int mxlen=0,mx=0;
    for (int i=1;i<n-1;i++)
    {

        if (p[i]>mx)
        {
            if ((i-p[i])/2<=0||((i-p[i])/2)+p[i]>=s.size())
            {

            mx=p[i];
            mxlen=i;
            }
        }
    }
    int start=(mxlen-mx)/2;
    return {start,mx};
}
void solve()
{
string s;
    cin>>s;
    string  rev1=s;
    string ss=s;
    string rev=s;
    reverse(all(rev));
    rev+="#"+s;
    reverse(all(rev1));
    s+="#"+rev1;

    auto pref=lcp(rev);
    int ps=0;
    for (int i=rev.size()/2+1;i<rev.size()&&pref[i];i++)ps=max(ps,pref[i]);
    int mxs=pref[rev.size()-1];
    auto pref2=lcp(s);
    int mxp=pref2[s.size()-1];


    string ns=ss.substr(ps,ss.size()-(2*ps));
    auto pal=mancher(ns);
    string ans="";

    ans+=ss.substr(0,ps);
    ans+=ns.substr(pal.first,pal.second);
    if (2*ps<=ss.size())
    ans+=ss.substr(ss.size()-ps,ps);


    string prefix=s.substr(0,mxp);
    string suffix=s.substr(ss.size()-mxs,mxs);

    if (ans.size()>prefix.size()){

        if (ans.size()>suffix.size())cout<<ans<<"\n";
        else cout<<suffix<<"\n";
    }
    else if (prefix.size()>suffix.size())cout<<prefix<<"\n";
    else
        cout<<suffix<<"\n";


}

int32_t main() {
    #ifndef ONLINE_JUDGE
        freopen("in.txt", "r", stdin);
        freopen("out.txt", "w", stdout);
    #endif

    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    int tc=1;
   cin>>tc;
    for (int i=1;i<=tc;i++){solve();}
    return 0;
}