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;
const double eps = 1e-9;
const long long oo = (long long)1e18;
const string nl = "\n";
long long pgcd(long long a, long long b) { return b ? pgcd(b, a % b) : a; }
void solve();
int32_t main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  solve();
  return 0;
}
long long n;
string S[100001];
set<long long> adj[26];
long long vu[26];
bool cycle = 0;
bool in[26];
void dfs(long long u) {
  if (vu[u] == 1) {
    cycle = 1;
    return;
  }
  if (vu[u] == 2) return;
  vu[u] = 1;
  for (auto v : adj[u]) dfs(v);
  vu[u] = 2;
}
void process(string p, long long M, long long lps[]) {
  long long len = 0;
  lps[0] = 0;
  long long i = 1;
  while (i < M) {
    if (p[i] == p[len]) {
      len++;
      lps[i] = len;
      i++;
    } else {
      if (len != 0)
        len = lps[len - 1];
      else
        lps[i] = 0, i++;
    }
  }
}
bool kmp(string p, string t) {
  long long M = p.length(), N = t.length();
  long long lps[M];
  process(p, M, lps);
  long long i = 0, j = 0;
  while (i < N) {
    if (p[j] == t[i]) i++, j++;
    if (j == M)
      return true;
    else if (i < N && p[j] != t[i]) {
      if (j != 0)
        j = lps[j - 1];
      else
        i++;
    }
  }
  return false;
}
void solve() {
  cin >> n;
  for (long long i = 0; i < n; i++) cin >> S[i];
  for (long long i = 0; i < n; i++)
    for (long long j = 0; j < S[i].length() - 1; j++)
      adj[S[i][j] - 'a'].insert(S[i][j + 1] - 'a');
  fill_n(in, 26, 0);
  for (long long i = 0; i < n; i++)
    for (long long j = 0; j < S[i].length(); j++) in[S[i][j] - 'a'] = 1;
  fill_n(vu, 26, 0);
  for (long long i = 0; i < 26; i++) {
    if (adj[i].size() > 1) {
      cout << "NO";
      return;
    }
    if (!vu[i]) dfs(i);
    if (cycle) {
      cout << "NO";
      return;
    }
  }
  long long tete[26];
  fill_n(tete, 26, 0);
  for (long long i = 0; i < 26; i++) {
    for (auto j : adj[i]) {
      tete[j]++;
    }
  }
  vector<string> chaines;
  for (long long i = 0; i < 26; i++) {
    if (tete[i] > 1) {
      cout << "NO";
      return;
    }
    if (tete[i] || !in[i]) continue;
    string s = "";
    s += (char)(i + 'a');
    long long c = i;
    while (adj[c].size() > 0) {
      c = (*adj[c].begin());
      s += (char)(c + 'a');
    }
    chaines.push_back(s);
  }
  sort(chaines.begin(), chaines.end());
  string rep = "";
  for (auto s : chaines) rep += s;
  for (long long i = 0; i < n; i++)
    if (!kmp(S[i], rep)) {
      cout << "NO";
      return;
    }
  cout << rep;
}
