#include <bits/stdc++.h>
using namespace std;
bool hayRepetidos(string &s) {
  vector<int> cant(26, 0);
  for (int i = 0; i < ((int)s.size()); i++) {
    int x = s[i] - 'a';
    cant[x]++;
    if (cant[x] > 1) return true;
  }
  return false;
}
bool dfs(int i, vector<set<int> > &grafo, vector<bool> &visitado,
         string &palabra) {
  if (visitado[i]) {
    return true;
  }
  visitado[i] = true;
  palabra += (char)(i + 'a');
  if ((int)grafo[i].size() == 1) {
    return dfs(*grafo[i].begin(), grafo, visitado, palabra);
  }
  return false;
}
int main() {
  ios::sync_with_stdio(false);
  int n;
  cin >> n;
  vector<bool> existe(26, false);
  vector<set<int> > grafo(26);
  vector<int> indegre(26, 0);
  for (int i = 0; i < (n); i++) {
    string s;
    cin >> s;
    if (hayRepetidos(s)) {
      cout << "NO\n";
      return 0;
    }
    for (int j = 0; j < ((int)s.size()); j++) {
      int sj = s[j] - 'a';
      existe[sj] = true;
      if (j == (int)s.size() - 1) break;
      int ssig = s[j + 1] - 'a';
      grafo[sj].insert(ssig);
      indegre[ssig]++;
    }
  }
  for (int i = 0; i < (26); i++) {
    if (grafo[i].size() > 1) {
      cout << "NO\n";
      return 0;
    }
  }
  vector<bool> visitado(26, false);
  vector<string> cadenas;
  for (int i = 0; i < (26); i++) {
    if (existe[i] && indegre[i] == 0) {
      string palabra = "";
      bool hayciclo = dfs(i, grafo, visitado, palabra);
      if (hayciclo) {
        cout << "NO\n";
        return 0;
      }
      cadenas.push_back(palabra);
    }
  }
  sort(cadenas.begin(), cadenas.end());
  string rta = "";
  for (string s : cadenas) rta += s;
  if ((int)rta.size() == 0) {
    cout << "NO\n";
    return 0;
  }
  for (auto s : cadenas) cout << s;
  cout << "\n";
}
