#include <iostream>
#include <map>
#include <vector>
#include <algorithm>

using namespace std;

vector <pair<char,char> > pravila;
map<char,char> M,M3;
map<pair<char,char>,int> M2;

bool pro (char a,char b){
    for (int i=0; i<pravila.size(); i++){
        if ((pravila[i].first==a && pravila[i].second==b) || (pravila[i].first==b && pravila[i].second==a)){
            if (pravila[i].first==a) return true; else return false;
            }
        }

    return true;
    }

int main(){

    string s[110],abe,abe2;
    int n;
    bool b;
    pair<char,char> par;

    cin >> n >> s[0];

    for (int j=0; j<s[0].size(); j++){
            M[s[0][j]]=s[0][j];
            }

    for (int i=1; i<n; i++){
        cin >> s[i];
        for (int j=0; j<s[i].size(); j++){
            M[s[i][j]]=s[i][j];
            }
        int j;
        for (j=0; j<s[i].size() && j<s[i-1].size() && s[i][j]==s[i-1][j]; j++){}
        if (j>s[i].size() || j>s[i-1].size()) continue;
        pravila.push_back(pair <char,char> (s[i-1][j],s[i][j]));
        M3[s[i][j]]=s[i][j];
        M3[s[i-1][j]]=s[i-1][j];
        }
    for (int i=0; i<pravila.size(); i++){
        par.first=pravila[i].first; par.second=pravila[i].second;
        if (M2[par]==1){cout << "!" << endl; return 0;}
        M2[par]=1;
        par.second=pravila[i].first; par.first=pravila[i].second;
        if (M2[par]==1){cout << "!" << endl; return 0;}
        M2[par]=1;
        }

    map<char,char>::iterator i;

    for (i=M.begin(); i!=M.end(); i++ ){
        abe += i->second;
        }
    for (i=M3.begin(); i!=M3.end(); i++ ){
        abe2 += i->second;
        }

    if (abe2.size()<abe.size()){cout << "?" << endl; return 0;}

    sort (abe.begin(),abe.end(),pro);

    cout << abe << endl;

    return 0;
    }
