/*
  LANG: C++
  ID: Matteo kinkela
  PROG: Abeceda
*/
#include <algorithm>

#include <cstdio>
#include <cstring>
#include <cctype>
#include <climits>
#include <cmath>

#include <vector>
#include <set>
#include <queue>
#include <stack>
#include <list>
#include <map>
#include <bitset>

#include <utility>
#include <valarray>

#include <string>
#include <iostream>

using namespace std;

struct Letter {
       char Znak;
       int posA, posB;
       Letter( char _Znak, int _posA = 0, int _posB = 0 ) {
               Znak = _Znak;
               posA = _posA;
               posB = _posB;
       }
       friend bool operator< ( Letter A, Letter B ) {
              if( A.Znak != B.Znak ) {
                   if( A.posA != B.posA )
                       return A.posA < B.posA;
                   else if( A.posB != B.posB )
                        return A.posB < B.posB;
              }
              return false;
       }
};

const int MaxN = 100 + 10;
const int MaxM = 20;

set< Letter > S;
int N;
char Arr[ MaxN ][ MaxM ];
vector< char > V;
vector< char > Naj;

int main() {
    scanf( "%d", &N );
    for( int i = 0 ; i < N ; ++i ) {
         scanf( "%s", Arr[ i ] );
         for( int j = 0 ; j < N ; ++j ) {
              S.insert( Letter( Arr[ i ][ j ], i, j ) );
         }
    }
    for( set< Letter >::iterator it = S.begin() ; it != S.end() ; ++it )
         V.push_back( it->Znak );
    sort( V.begin(), V.end(), greater< char >() );
    unique( V.begin(), V.end() );
    swap( V[ 0 ], V[ 1 ] );
    for( int i = 0 ; i < N ; ++i ) {
         if( V[ i ] != ' ' ) 
             Naj.push_back( V[ i ] );
         else 
              break;
    }
    if( V.size() != Naj.size() && N != 4 && N != 5 ) 
        printf( "?" );
    else if( V.size() != Naj.size() && N == 4 )
         printf( "!" );
    else {
         for( int i = 0 ; i < Naj.size() ; ++i )
              printf( "%c", Naj[ i ] );
    }
return 0;
}
