#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>

using namespace std;

int ima[ 30 ];
char m[ 105 ][ 20 ];
vector< int > V[ 30 ];
vector< int > sol;
int rod[ 30 ];
bool bio[ 30 ];
bool moze;
bool jesam;

void ispis( int x )
{
	jesam = 1;
	while( x != -1 )
	{
		sol.push_back( x );
		x = rod[ x ];
    }
    for( int i = sol.size() - 1; i >= 0; --i )
    	printf( "%c", sol[ i ] + 'a' );
    printf( "\n" );
}

void dfs( int gdje )
{
	if( V[ gdje ].size() == 0 )
	{
		bool ok = 1;
		for( int i = 0; i < 30; ++i )
			if( ima[ i ] && !bio[ i ] )
				ok = 0;
		if( ok )
		{
			moze = 1;
			if( !jesam ) ispis( gdje );
		}
		return;
	}
	for( int i = 0; i < V[ gdje ].size(); ++i )
	{
		int t = V[ gdje ][ i ];
		if( !bio[ t ] )
		{
			bio[ t ] = 1; rod[ t ] = gdje;
			dfs( t );
			bio[ t ] = 0;
		}
	}
}

int main( void )
{
	int n;
	scanf( "%d", &n );

	for( int i = 0; i < n; ++i )
		scanf( "%s", m[ i ] );

	for( int i = 0; i < n; ++i )
		for( int j = i + 1; j < n; ++j )
		{
			int ide = min( strlen( m[ i ] ), strlen( m[ j ] ) );
			for( int l = 0; l < ide; ++l )
			{
				if( m[ i ][ l ] != m[ j ][ l ] )
				{
					V[ m[ i ][ l ] - 'a' ].push_back( m[ j ][ l ] - 'a' );
					break;
				}
			}
		}

	for( int i = 0; i < n; ++i )
	{
		int dulj = strlen( m[ i ] );
		for( int j = 0; j < dulj; ++j )
			ima[ m[ i ][ j ] - 'a' ] = 1;
	}


	bool upitn = 0; int kol = 0;
	for( int i = 0; i < 30; ++i )
		if( ima[ i ] && V[ i ].size() == 0 )
			++kol;
	if( kol > 1 )
		upitn = 1;

	moze = 0; jesam = 0;
	if( !upitn )
		for( int i = 0; i < 30; ++i )
			if( ima[ i ] )
			{
				for( int j = 0; j < 30; ++j ) rod[ j ] = -1;
				bio[ i ] = 1;
				dfs( i );
				bio[ i ] = 0;
			}

	if( upitn ) printf( "?\n" );
	if( !moze && !upitn ) printf( "!\n" );

	return 0;
}
