// clang-format off
#include <bits/stdc++.h>
#define int long long
#define main signed main()
#define loop(i, a, n) for (int i = (a); i < (n); i++)
#define rep(i, n) loop(i, 0, n)
#define forever for (;;)
#define all(v) (v).begin(), (v).end()
#define rall(v) (v).rbegin(), (v).rend()
#define prec(n) fixed << setprecision(n)
template<typename A> using V = std::vector<A>;
template<typename A> using F = std::function<A>;
template<typename A, typename B> using P = std::pair<A, B>;
using pii = P<int, int>;
using vi = V<int>;
using vd = V<double>;
using vs = V<std::string>;
using vpii = V<pii>;
using vvi = V<vi>;
using vvpii = V<vpii>;
constexpr int INF = sizeof(int) == sizeof(long long) ? 1000000000000000000LL : 1000000000;
constexpr int MOD = 1000000007;
constexpr double PI = 3.14159265358979;
template<typename A, typename B> bool cmin(A &a, const B &b) { return a > b ? (a = b, true) : false; }
template<typename A, typename B> bool cmax(A &a, const B &b) { return a < b ? (a = b, true) : false; }
constexpr bool odd(const int n) { return n & 1; }
constexpr bool even(const int n) { return ~n & 1; }
template<typename T> std::istream &operator>>(std::istream &is, std::vector<T> &v) { for (T &x : v) is >> x; return is; }
template<typename A, typename B> std::istream &operator>>(std::istream &is, std::pair<A, B> &p) { is >> p.first; is >> p.second; return is; }
using namespace std;
// clang-format on

template<typename String> bool isPalindrome(const String &s) {
  int n = s.size();
  rep(i, n / 2) if (s[i] != s[n - 1 - i]) return false;
  return true;
}

template<typename String> bool isPalindromeOf(String s, const String &t) {
  reverse(all(s));
  return s == t;
}

main {
  int n, l;
  cin >> n >> l;
  vs s(n);
  cin >> s;
  vi used(n);
  V<string> palis;
  rep(i, n) {
    if (used[i]) continue;
    loop(j, i + 1, n) {
      if (used[j]) continue;
      if (isPalindromeOf(s[i], s[j])) {
        used[i] = used[j] = true;
        string t = s[i];
        reverse(all(t));
        palis.emplace_back(min(t, s[i]));
        goto next;
      }
    }
  next:;
  }
  string midS = string(1, char('z' + 1));
  rep(i, n) {
    if (used[i]) continue;
    if (!isPalindrome(s[i])) continue;
    cmin(midS, s[i]);
  }
  sort(all(palis));
  for (auto &t : palis) cout << t;
  if (midS != string(1, char('z' + 1))) cout << midS;
  reverse(all(palis));
  for (auto t : palis) {
    reverse(all(t));
    cout << t;
  }
  cout << endl;
}

