#include <bits/stdc++.h>
using namespace std;
bool operator<(const string s, const string t) {
  int m = s.size(), n = t.size(), p = min(m, n), i;
  for (i = 0; i < p; i++) {
    if (s[i] != t[i]) break;
  }
  if (i != p) {
    return (s[i] < t[i]);
  } else {
    if (m > n) {
      return (s.substr(i) < t);
    }
    if (n > m) {
      return (s < t.substr(i));
    } else
      return true;
  }
}
void merge(string s[], int m, int n, int p) {
  int it1 = m, it2 = p + 1;
  string temp[n - m + 1];
  int i = 0;
  while (it1 <= p and it2 <= n) {
    if (s[it1] < s[it2]) {
      temp[i] = s[it1];
      it1++;
      i++;
    } else {
      temp[i] = s[it2];
      it2++;
      i++;
    }
  }
  if (it1 > p) {
    for (; i <= n - m; i++) {
      temp[i] = s[it2];
      it2++;
    }
  }
  if (it2 > p) {
    for (; i <= n - m; i++) {
      temp[i] = s[it1];
      it1++;
    }
  }
  for (int j = m; j <= n; j++) {
    s[j] = temp[j - m];
  }
}
void merge_sort(string s[], int i, int j) {
  if (i == j) {
    return;
  } else {
    int p = (i + j) / 2;
    merge_sort(s, i, p);
    merge_sort(s, p + 1, j);
    merge(s, i, j, p);
  }
}
int main() {
  int n;
  cin >> n;
  string s[n];
  for (int i = 0; i < n; i++) {
    cin >> s[i];
  }
  merge_sort(s, 0, n - 1);
  for (int i = 0; i < n; i++) {
    cout << s[i];
  }
  cout << endl;
}
