#include <iostream>
#include <algorithm>
#include <cmath>
#include <iomanip>
#include <string.h>
using namespace std;
struct N
{
int sss[11];
int dig;
};
typedef struct N nnn;
void getline(nnn &a)
{
int loop = 0;
char c;
a.dig = 0;
while ((c = getchar()) != ' ' && c != '\n')
{
a.sss[loop++] = c - '0';
a.dig++;
}
}
bool cmp(nnn &a, nnn &b)
{
int d1 = a.dig, d2 = b.dig;
int dig = d1 > d2 ? d2 : d1;
int max = d1 > d2 ? d1 : d2;
int loop = 0;
for (; loop < dig; loop++)
{
if (a.sss[loop] > b.sss[loop])
{
return true;
}
else if (a.sss[loop] < b.sss[loop])
{
return false;
}
}
if (d1 > d2)
{
for (; loop < max; loop++)
{
if (a.sss[loop] > b.sss[loop % (dig)])
{
return true;
}
if (a.sss[loop] < b.sss[loop % (dig)])
{
return false;
}
}
return false;
}
if (d1 < d2)
{
for (; loop < max; loop++)
{
if (b.sss[loop] > a.sss[loop % (dig)])
{
return false;
}
if (b.sss[loop] < a.sss[loop % (dig)])
{
return true;
}
}
return false;
}
return false;
}
int main()
{
int number;
cin >> number;
getchar();
nnn arr[number];
for (int loop = 0; loop < number; loop++)
{
getline(arr[loop]);
}
sort(&arr[0], &arr[number], cmp);
for (int loop = 0; loop < number; loop++)
{
for (int l = 0; l < arr[loop].dig; l++)
{
cout << arr[loop].sss[l];
}
}
return 0;
}