#include<sstream>
#include<cctype>
#include<iostream>
#include<set>
#include<map>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;

#define REP(i, j) for (int (i) = 0; (i) < (j); ++(i))
#define FOR(i, k, j) for (int (i) = (k); (i) < (j); ++(i))

bool check(string str);
string makestr(string str);

int main(){
    string tmpin;
    while(getline(cin, tmpin)){
        string in = makestr(tmpin);
        set<string> s;
        vector<string> tmpvec;
        int tmpsize = in.size();
        FOR(i, 1, tmpsize - 1){
            int right1 = i - 1, left1 = i + 1, right2 = i - 1, left2 = i + 2;
            while(right1 >= 0 && left1 < tmpsize){
                string tmp = in.substr(right1, left1 - right1 + 1);
                if(check(tmp)) tmpvec.push_back(tmp);
                else break;
                right1--; left1++;
            }
            if(!tmpvec.empty()) s.insert(tmpvec[tmpvec.size() - 1]);
            tmpvec.clear();
            while(right2 >= 0 && left2 < tmpsize){
                string tmp = in.substr(right2, left2 - right2 + 1);
                if(check(tmp)) tmpvec.push_back(tmp);
                else break;
                right2--; left2++;
            }
            if(!tmpvec.empty()) s.insert(tmpvec[tmpvec.size() - 1]);
        }
        vector<string> v;

        for(set<string>::iterator its = s.begin(); its != s.end(); its++) v.push_back((*its));

        int vsize = v.size();

        REP(i, vsize - 1){
            int nowm = i;
            FOR(j, i + 1, vsize){
                if(v[nowm].size() < v[j].size()) nowm = j;
            }
            swap(v[i], v[nowm]);
        }

        //REP(i, v.size()) cout <<v[i] <<", ";
        //cout <<endl;
        bool startflg = false;

        while(v.size()){
            vector<string>::iterator it = v.begin();
            if(startflg) cout <<" ";
            cout <<(*it);
            startflg = true;
            string now = (*it);
            v.erase(it);

            int right, left;
            if(now.size() % 2 == 1){
                right = now.size() / 2 - 1; left = now.size() / 2 + 1;
            } else{
                right = now.size() / 2 - 2; left = right + 3;
            }

            while(right >= 0 && left < now.size()){
                string tmp = now.substr(right, left - right + 1);
                if(check(tmp)){
                    for(vector<string>::iterator itv = v.begin(); itv != v.end(); itv++){
                        if((*itv) == tmp){
                            v.erase(itv);
                            break;
                        }
                    }
                } else{
                    break;
                }
                right--; left++;
            }
        }
        cout <<endl;
    }
    return 0;
}

bool check(string str){
    int right = 0, left = str.size() - 1;
    bool ret = true;
    while(right < left){
        if(str[right] != str[left]){
            ret = false;
            break;
        }
        right++; left--;
    }
    return ret;
}

string makestr(string str){
    stringstream ss;
    REP(i, str.size()){
        if(isalpha(str[i])){
            if(islower(str[i])) ss <<(char)(toupper(str[i]));
            else ss <<str[i];
        }
    }
    return ss.str();
}

Measured memory_bytes: 1232