#include <iostream>
#include <string>
using namespace std;

const int maxc = 'z' - 'a' + 1; // tähestiku suurus

// C ja C++ globaalsed staatilised muutujad (ja ainult need!)
// algväärtustatakse nullidega; keeltes, kus see nii ei ole,
// tuleks e, ne, g, ng, nu programmeerijal algväärtustada;
// r kui string objekt initsialiseerib ennast ise

bool e[maxc]; // e[i] == kas täht i on olemas
int ne; // tähtede arv

bool g[maxc][maxc]; // g[i][j] == täht i peab olema pärast tähte j
int ng[maxc]; // ng[i] on tähe i seoste arv

bool nu; // kas vastus on mitteühene

int n; // sõnade arv
string s, ss; // jooksev, eelmine sõna

string r; // tulemus

int main() {
	cin >> n;
	for (int i = 0; i < n; ++i) {
		cin >> s;
		for (int j = 0; j < s.length(); ++j) {
			// jätame meelde, millised tähed on esinenud
			if (!e[s[j] - 'a']) {
				e[s[j] - 'a'] = true;
				++ne;
			}
		}
		if (i > 0) {
			// kui eelmine sõna on olemas, võrdleme sellega
			for (int j = 0; j < s.length() && j < ss.length(); ++j) {
				if (s[j] != ss[j]) {
					// sõnade järjekorra määrab esimene erinev täht
					if (!g[s[j] - 'a'][ss[j] - 'a']) {
						// jätame otsustavate tähtede suhte meelde
						g[s[j] - 'a'][ss[j] - 'a'] = true;
						++ng[s[j] - 'a'];
					}
					break;
				}
			}
		}
		ss = s;
	}
	// leiame tähtede järjekorra topoloogilise sorteerimisega
	while (ne > 0) {
		// otsime minimaalset ja kontrollime, kas on täpselt üks minimaalne
		int nm = 0; char cm;
		for (char c = 'a'; c <= 'z'; ++c) {
			if (e[c - 'a'] && ng[c - 'a'] == 0) {
				// kui täht on olemas ja pole ühestki suurem
				// siis on minimaalne
				++nm; cm = c;
			}
		}
		if (nm < 1) {
			// kui minimaalset ei olnud, siis on andmed vastuolulised
			cout << "!" << endl;
			return 0;
		}
		if (nm > 1) {
			// kui minimaalseid oli mitu, siis pole vastus ühene
			// aga seda järeldust ei või siin kohe väljastada,
			// sest tagapool võib veel tulla vastuolu
			nu = true;
		}
		// minimaalne täht graafist välja ja vastuse lõppu
		e[cm - 'a'] = false; --ne;
		for (char c = 'a'; c <= 'z'; ++c) {
			if (g[c - 'a'][cm - 'a']) {
				g[c - 'a'][cm - 'a'] = false; --ng[c - 'a'];
			}
		}
		r += cm;
	}
	if (nu) {
		// kui mingis kohas minimaalne oli mitteühene
		cout << "?" << endl;
		return 0;
	}
	// on täpselt üks võimalik vastus
	cout << r << endl;
	return 0;
}
