#include <iostream>
#include <string>
#include <vector>
#include <set>
#include <cstring>

using namespace std;




    string rijeci[105]; bool stop = false;

    set<char> slova;

    #define pcc pair<char, char>

    set < pcc > manji;


    int n;
    
    void sredi(int s, int p, int d) {
    
        //cout << "sredi(" << s << ", " << p << ", " << d << ")"<<endl;
        int i,j;
        
        if(d>=rijeci[s].length()) return;
        char t = rijeci[s][d]; int zs = s;
        for(i=s+1; i<p; i++) {
            if(d>= rijeci[i].length()) return;
            if(rijeci[i][d] != t) {
                manji.insert(pcc(t, rijeci[i][d]));
                if(i-zs>1) sredi(zs, i, d+1);
                zs=i; t= rijeci[i][d]; }
        }
        if(p - zs > 1) sredi(zs, p, d+1);
    }
  
  
  
    char prvi;    int bio[500];
  
    void redfs(char g, int dub)  {
        
        bool biob = false;

        if(bio[g-'a'] == 1)  { cout << "!" << endl; stop = true; return; }

        bio[g - 'a'] = 1;
        
        //cout << g << ";";
        
        if(dub > 1000) { cout << "!" << endl; stop = true; return; }
        
      for(set<pcc>::iterator it = manji.begin(); it != manji.end(); it++) {
            if( (*it).second == g) { redfs( (*it).first,dub+1); biob = true; }
         
    }
    
    bio[g-'a']= 2;
        if(!biob){ prvi = g; return; }
        
             
}    
    
    

    
    struct slovo { int izl; char c; slovo(int a, char b) : izl(a), c(b) { }; };
    bool operator< (const slovo& a, const slovo& b) {
        return a.izl>b.izl; };
        
    set<slovo> abeceda; int vrijeme=0;
    
    
    void dfs(char g, int d)  {
         
     if(d>1000) {cout << "!" << endl; stop = true; return; }
         
         bio[ g-'a'] = 1;
         //cout << g << ":";
              

        
      for(set<pcc>::iterator it = manji.begin(); it != manji.end(); it++) {
            if( (*it).first == g && !bio[ ((*it).second )- 'a']) { dfs( (*it).second, d+1); }
         
    }
    

        vrijeme++; abeceda.insert(slovo( vrijeme, g ));
        
}    
   
int main() {
    cin >> n;
    int i;
    
    for(i=0; i<n; i++)
        cin >> rijeci[i]; 
        
    int j; 
    for(i=0; i<n; i++)
        for(j=0; j<rijeci[i].length(); j++)
            slova.insert(rijeci[i][j]);    

        
    sredi(0,n,0);
    
    
    
   /* set<pcc>::iterator it = manji.begin();
    abeceda.push_back( (*it).first);
    abeceda.push_back( (*it).second);
    it++;
    for(; it != manji.end(); it++) {
        cout << (*it).first << " " << (*it).second << endl;
        
        char m = (*it).first, v = (*it).second;*/
        
        
    /*for(set<pcc>::iterator it = manji.begin(); it != manji.end(); it++) {
        cout << (*it).first << " " << (*it).second << endl;
         
    }*/

    memset(bio,0,sizeof bio);
    
    
    for(set<char>::iterator it = slova.begin(); it != slova.end(); it++) {
           if(!bio[(*it)-'a']) redfs( *it,0 );
    }
        

    if(stop) return 0;
    
    //cout << endl;

    memset(bio,0,sizeof bio);
    dfs(prvi,0);
    if(stop) return 0;
    
    //cout << endl;
    
    if(abeceda.size() < slova.size() ) cout << "?" << endl;
    else{ for(set<slovo>::iterator it = abeceda.begin(); it != abeceda.end(); it++) {
        cout << (*it).c;
    }
    cout << endl;  }

    //system("pause");
    }
