#include <bits/stdc++.h>
using namespace std;
int N;
string S[555];
vector<int> G[27];
vector<int> rG[27];
bool used[27];
void dfs(int v, vector<int>& vs) {
  used[v] = true;
  for (int i = 0; i < (int)G[v].size(); i++) {
    if (used[G[v][i]]) continue;
    dfs(G[v][i], vs);
  }
  vs.push_back(v);
  return;
}
void rdfs(int v, int t) {
  used[v] = true;
  for (int i = 0; i < (int)rG[v].size(); i++) {
    if (used[rG[v][i]]) continue;
    rdfs(rG[v][i], t);
  }
}
int scc() {
  memset(used, 0, sizeof(used));
  vector<int> vs;
  for (int i = 0; i < 26; i++)
    if (!used[i]) dfs(i, vs);
  memset(used, 0, sizeof(used));
  int t = 0;
  for (int i = 25; i > -1; i--)
    if (!used[vs[i]]) rdfs(vs[i], t++);
  return t;
}
void init() {
  for (int i = 0; i < 26; i++) {
    G[i].clear();
    rG[i].clear();
  }
}
void add_edge(char u, char v) {
  G[u - 'a'].push_back(v - 'a');
  rG[v - 'a'].push_back(u - 'a');
}
void view() {
  for (int i = 0; i < 26; i++) {
    char c = i + 'a';
    cout << c << ": " << endl;
    for (int j = 0; j < (int)G[i].size(); j++) {
      cout << " -> " << (char)(G[i][j] + 'a') << endl;
    }
  }
}
bool makeg(int l, int h, int f) {
  if (l >= h) return true;
  char c = '.';
  int pd;
  c = S[l][f];
  pd = l;
  for (int i = l + 1; i <= h; i++) {
    if (S[i][f] == '#') {
      if (c != '#') return false;
      if (!makeg(i + 1, h, f)) return false;
      return true;
    }
    if (S[i][f] != c) {
      if (!makeg(pd, i - 1, f + 1)) return false;
      add_edge(S[i][f], c);
      c = S[i][f];
      pd = i;
    }
  }
  return makeg(pd, h, f + 1);
}
bool make_graph() {
  return makeg(0, N - 1, 0);
  view();
}
int main() {
  while (cin >> N && N) {
    for (int i = 0; i < N; i++) {
      cin >> S[i];
      S[i] += "#";
    }
    init();
    if (!make_graph() || scc() < 26)
      cout << "no" << endl;
    else
      cout << "yes" << endl;
  }
}
