/*
	DRZAVNO TAKMICENJE 2008
	ZADATAK: najmanji
	AUTOR: Aleksandar i Andreja Ilic, Nis

		Treba odrediti permutaciju unetih brojeva a [1], a [2], ..., a [n]
	tako da je konkatenirani veliki broj najmanji moguc. Vrsimo zamenu
    dva susedna broja x i y	ako je broj xy veci od yx.

		Zbog ogranicenja u zadatku, brojeve je najbolje posmatrati kao
	stringove ili 64-bitne brojeve.

		Vremenska slozenost je O (n log n), a prostorna O (n).

*/

#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <cmath>
#define MAXN 5001
using namespace std;

int n, length;
long a [MAXN];

// Fja uporedjivanja dva broja
int compare (const void * a, const void * b)
{
	__int64 x = *(long*) a;
	__int64 y = *(long*) b;

	long tmp = (long) y;
	__int64 xy = x;
	while (tmp > 0)
	{
		xy = xy * 10;
		tmp = tmp / 10;
	}
	xy = xy + y;

	tmp = (long) x;
	__int64 yx = y;
	while (tmp > 0)
	{
		yx = yx * 10;
		tmp = tmp / 10;
	}
	yx = yx + x;

	if (xy < yx)
		return -1;
	else if (xy > yx)
		return 1;
	else
		return 0;
}

int main ()
{
	/* Ucitavanje podataka */
	ifstream in ("najmanji.in");
	in >> n;
	for (int i = 0; i < n; i++)
		in >> a [i];
	in.close();

	/* Sortiranje */
	qsort (a, n, sizeof (long), compare);

	/* Stampa rezultata */
	ofstream out ("najmanji.out");
	for (int i = 0; i < n; i++)
		out << a [i];
	out << endl;
 	out.close();
    return 0;
}
