#include <cstdio>
#include <algorithm>
#include <vector>
#include <cstring>

using namespace std;

int M[30][30];
char S[15][110];
bool SLO[30];
vector <char> SS;
bool cmp(char a, char b)
{
    return (M[a-'a'][b-'a']==true);
}

bool bio[30];
bool cik(int node)
{
    if (bio[node]) return true;
    bio[node] = true;
    bool sol = false;
    for (int i=0; i<30; i++)
        if (M[node][i]==true) sol|=cik(i);
    bio[node] = false;
    return sol;
}
int main()
{
    memset(M, -1, sizeof M);
    memset(bio, 0, sizeof bio);
    memset(SLO, 0, sizeof SLO);
    int n;
    scanf("%d", &n);
    for (int i=0; i<n; i++) {
        scanf(" %s", S[i]);
        for (int j=0; j<strlen(S[i]); j++)
            SLO[S[i][j]-'a'] = true;
        if (i>0) {
            int j = 0;
            while (j<min(strlen(S[i-1]), strlen(S[i])) && (S[i-1][j]==S[i][j])) j++;
            if    (j<min(strlen(S[i-1]), strlen(S[i]))) {
                char a = S[i-1][j];
                char b = S[i][j];
                a-='a';
                b-='a';
                M[a][b] = true;
            }
        }
    }
    for (int k=0; k<30; k++) {
        for (int i=0; i<30; i++)
            for (int j=0; j<30; j++) {
                if (M[i][k]==-1 || M[k][j] == -1) continue;
                if ( M[i][k] == M[k][j] ) M[i][j] = true;
            }
    }

    for (int i=0; i<30; i++)
        if (cik(i)) {
            printf("!\n");
            return 0;
        }

    for (int i=0; i<29; i++)
        for (int j=i+1; j<30; j++) {
            if (SLO[i]==false || SLO[j] == false) continue;
            if (M[i][j]==M[j][i]) {
                printf("?\n");
                return 0;
            }
        }
    for (int i=0; i<30; i++)
        if (SLO[i]) SS.push_back(i + 'a');

    sort(SS.begin(), SS.end(), cmp);
    for (int i=0; i<SS.size(); i++)
        printf("%c", SS[i]);

    printf("\n");
}

