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 int INF = (int)1E9;
char str[100005 * 2];
int cnt[26];
vector<string> ss;
int main() {
  int n;
  cin >> n;
  for (int i = (0); i < (n); i++) {
    scanf("%s", str);
    ss.push_back(str);
    memset(cnt, 0, sizeof(cnt));
    int len = strlen(str);
    for (int j = (0); j < (len); j++) cnt[str[j] - 'a']++;
    for (int c = (0); c < (26); c++)
      if (cnt[c] >= 2) return puts("NO"), 0;
  }
  for (int c = (0); c < (26); c++) {
    vector<pair<int, int> > hits;
    vector<string> newss;
    for (int i = (0); i < (ss.size()); i++) {
      bool merged = false;
      for (int j = (0); j < (ss[i].size()); j++) {
        if (ss[i][j] == 'a' + c) {
          hits.push_back(pair<int, int>(i, j));
          merged = true;
          break;
        }
      }
      if (!merged) newss.push_back(ss[i]);
    }
    if (hits.empty()) continue;
    memset(str, 0, sizeof(str));
    int allb = INF;
    for (int i = (0); i < (hits.size()); i++) {
      int si = hits[i].first, p = hits[i].second, b = 100005 - p;
      allb = min(allb, b);
      for (int j = (0); j < (ss[si].size()); j++) {
        if (str[b + j] == 0)
          str[b + j] = ss[si][j];
        else if (str[b + j] != ss[si][j])
          return puts("NO"), 0;
      }
    }
    ss = newss;
    ss.push_back(str + allb);
    string &lss = ss.back();
    memset(cnt, 0, sizeof(cnt));
    for (int j = (0); j < (lss.size()); j++) cnt[lss[j] - 'a']++;
    for (int c = (0); c < (26); c++)
      if (cnt[c] >= 2) return puts("NO"), 0;
  }
  sort(ss.begin(), ss.end());
  for (int i = (0); i < (ss.size()); i++) printf("%s", ss[i].c_str());
  puts("");
  return 0;
}
