A substring of some string is called the most frequent, if the number of its occurrences is not less than number of occurrences of any other substring.

You are given a set of strings. A string (not necessarily from this set) is called good if all elements of the set are the most frequent substrings of this string. Restore the non-empty good string with minimum length. If several such strings exist, restore lexicographically minimum string. If there are no good strings, print "NO" (without quotes).

A substring of a string is a contiguous subsequence of letters in the string. For example, "ab", "c", "abc" are substrings of string "abc", while "ac" is not a substring of that string.

The number of occurrences of a substring in a string is the number of starting positions in the string where the substring occurs. These occurrences could overlap.

String a is lexicographically smaller than string b, if a is a prefix of b, or a has a smaller letter at the first position where a and b differ.

Input

The first line contains integer n (1 ≤ n ≤ 105) — the number of strings in the set.

Each of the next n lines contains a non-empty string consisting of lowercase English letters. It is guaranteed that the strings are distinct.

The total length of the strings doesn't exceed 105.

Output

Print the non-empty good string with minimum length. If several good strings exist, print lexicographically minimum among them. Print "NO" (without quotes) if there are no good strings.

Examples

Input

4
mail
ai
lru
cf


Output

cfmailru


Input

3
kek
preceq
cheburek


Output

NO

Note

One can show that in the first sample only two good strings with minimum length exist: "cfmailru" and "mailrucf". The first string is lexicographically minimum.
#include <bits/stdc++.h>
using namespace std;
template <class t>
t mag(t a) {
  return a > 0 ? a : -a;
}
template <class T, class U>
T cdiv(T num, U den) {
  return (num / den) + ((num % den) > 0);
}
std::ifstream term("/dev/tty");
std::string tempstring;
using ll = int_fast64_t;
using ii = pair<int, int>;
using vi = vector<int>;
using vl = vector<ll>;
using vii = vector<ii>;
const int &sij = 400010;
const ll &mod = 1000000007ll;
int n, pre[200], nx[200], fre[200], vis[200], cyc;
string prt;
vector<string> vec;
void fail() {
  cout << "NO";
  exit(0);
}
int esc(int tcase) {
  cin >> n;
  vec.resize(n);
  memset(pre, -1, sizeof(pre));
  memset(nx, -1, sizeof(nx));
  for (auto &e : vec) cin >> e;
  for (auto &e : vec) {
    if (e.size() > 26) {
      fail();
    }
    fre[e[0]] = 1;
    for (auto i = 0; i != e.size() - 1; i++) {
      fre[e[i]] = fre[e[i + 1]] = 1;
      if (nx[e[i]] == -1) {
        nx[e[i]] = e[i + 1];
      } else if (nx[e[i]] != e[i + 1]) {
        fail();
      }
      if (pre[e[i + 1]] == -1) {
        pre[e[i + 1]] = e[i];
      } else if (pre[e[i + 1]] != e[i]) {
        fail();
      }
    }
  }
  function<void(char)> dfs;
  dfs = [&](int x) {
    vis[x] = 1;
    if (nx[x] != -1) {
      if (vis[nx[x]] == 1) {
        fail();
      }
      if (vis[nx[x]] == 0) dfs(nx[x]);
    }
    vis[x] = 2;
  };
  for (auto i = 'a'; i <= 'z'; i++) {
    if (vis[i] == 0) dfs(i);
  }
  for (auto i = 'a'; i <= 'z'; i++) {
    if (pre[i] == -1 and fre[i]) {
      char cr = i;
      prt += cr;
      while (nx[cr] != -1) {
        prt += char(nx[cr]);
        cr = nx[cr];
      }
    }
  }
  cout << prt << '\n';
  return 0;
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  int tc = 1;
  for (int i = 1; i <= tc; i++) esc(i);
}
