#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <climits>
#include <vector>
#include <map>
#include <set>
#include <list>
#include <stack>
#include <queue>
#include <algorithm>
#include <iostream>
#include <string>

#define REP(i,n) for(long long i=0;i<n;++i)
#define REPR(i,n) for(long long i=n;i>=0;--i)
#define REPI(itr,v) for(auto itr=v.begin();itr!=v.end();++itr)
#define REPIR(itr,v) for(auto itr=v.rbegin();itr!=v.rend();++itr)
#define FOR(i,a,b) for(long long i=a;i<b;++i)
#define SORT(v,n) sort(v, v+n)
#define SORTV(v) sort(v.begin(), v.end())
#define ALL(v) v.begin(),v.end()
#define llong long long
#define INF 999999999
#define SUR 1000000007
#define pb push_back
#define pf push_front
#define MP make_pair
#define SV(v) {for(long long sitr=0;sitr<v.size();++sitr){cin>>v[sitr];}}

int dx[] = {0, 0, -1, 1};
int dy[] = {1, -1, 0, 0};

using namespace std;

typedef pair<int,int> pii;

bool p[1000][1000];

bool is_alphabet(char c){
  if((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')){
    return true;
  }

  return false;
}

bool is_palindrome(string s){
  int len = s.length();
  for(int i = 0; i < len / 2; ++i){
    if(s[i] != s[len-i-1]){
      return false;
    }
  }
  return true;
}

int main(){

  string tmp;
  while(getline(cin, tmp)){
    vector<char> s;
    REP(i,tmp.length()){
      if(is_alphabet(tmp[i])){
        s.pb(toupper(tmp[i]));
      }
    }

    int len = s.size();
    REP(i,len){
      REP(j,len){
        p[i][j] = false;
      }
    }

    for(int w = 1; w < len; ++w){
      for(int i = 0; i + w < len; ++i){

        if(w == 1 || w == 2){
          if(s[i] == s[i+w]){
            p[i][i+w] = true;
            //cout << s[i] << " " << s[i + w] << endl;
          }

        }else{
          if(s[i] == s[i+w] && p[i+1][i+w-1]){
            //for(int l = 1; (i+w-l -(i+l) >= 1); ++l){
              //if(p[i+l][i+w-l-1] == false) break;            
            p[i+1][i+w-1] = false;
            //}
            p[i][i+w] = true;
          }
        }
      }
    }

    map<string, int> mp, check;
    REP(i,len-1){
      FOR(j,i+2,len){
        if(p[i][j]){
          string t(s.begin() + i, s.begin() + j + 1);
          string tt(s.begin()+i+1, s.begin() + j);
          mp[t]++;
          check[tt]++;
         }
      }
    }
    
    REPI(itr, mp){
      string tt = itr->first;
      for(int i = 1; (tt.length() - i - 1) - i > 1; ++i){
        string sb = tt.substr(i, tt.length()-i*2);
        if(sb == "") break;
        if(is_palindrome(sb)){
          if(mp.find(sb) != mp.end()){
            mp[sb] = 0;
          }
        }else{
          break;
        }
      }
    }

    REPI(itr, mp){
      if(itr->second != 0){
        cout << itr->first;
        auto itr_tmp = itr;
        itr_tmp++;
        if(itr_tmp != mp.end()){
          cout << " ";
        }
      }
      
    }
    cout << "\n"; 
    /*
    REPI(itr, s){
      cout << *itr;
    }
    cout << endl;
    */
  }
  return 0;
}


