unittest
{
	assert( [ "3", "cbaa", "daacc", "acacac" ].parse.expand.solve == "aac" );
	assert( [ "3", "a", "aa", "b" ].parse.expand.solve == "" );
}



import std.algorithm;
import std.conv;
import std.range;
import std.stdio;
import std.typecons;

void main()
{
	stdin.byLineCopy.parse.expand.solve.writeln;
}

auto parse( Range )( Range input )
if( isInputRange!Range && is( ElementType!Range == string ) )
{
	auto n = input.front.to!( long );
	auto ss = new dchar[][ n ];
	foreach( ref s; ss )
	{
		input.popFront;
		s = input.front.to!( dchar[] );
	}
	return tuple( ss );
}

auto solve( dchar[][] ss )
{
	dchar[] ans;
	
	// 答えが辞書順指定なので並び替えておく
	ss.each!( sort );
	
	LOOP: while( true )
	{
		// 各文字列の先頭で一番大きい文字を検索
		auto cb = ss.map!( ( a ) => a[ 0 ] ).reduce!( max );
		
		// 全文字列の先頭が一番大きい文字か判定
		auto eq = ss.map!( ( a ) => a[ 0 ] == cb ).reduce!( ( a, b ) => a && b );
		if( eq )
		{
			// 一番大きかった文字を答えに追加
			ans ~= cb;
			
			// 各文字列から先頭文字を削除
			foreach( ref s; ss )
			{
				s.popFront;
				if( s.empty ) break LOOP;
			}
		}
		else
		{
			// 各文字列の先頭から一番大きかった文字の手前まで削除
			foreach( ref s; ss )
			{
				s = s.find!( ( c ) => cb <= c );
				if( s.empty ) break LOOP;
			}
		}
	}
	
	return ans;
}
