#include "bits/stdc++.h"
using namespace std;

// Inserted snippets: io, root
#define rep(i, a, b) for(int i = a; i < (b); ++i)
#define all(x) begin(x), end(x)
#define sz(x) (int)(x).size()
typedef long long ll;
typedef pair<int, int> pii;
typedef vector<int> vi;
template<typename H> bool chmin(H& v1, const H v2) { if (v1 > v2) { v1 = v2; return true; } return false; }
template<typename H> bool chmax(H& v1, const H v2) { if (v1 < v2) { v1 = v2; return true; } return false; }
template<typename H> void read(H& head) { cin >> head; }
template<typename H, typename ...T> void read(H& head, T& ...tail) { cin >> head; read(tail...); }
template<typename H> void write(H head) { cout << head << '\n'; }
template<typename H, typename ...T> void write(H head, T ...tail) { cout << head << " "; write(tail...); }
template<typename ...T> void die(T ...tok) { write(tok...); exit(0); }
// End snippets

int main() {
	cin.tie(0)->sync_with_stdio(0);
	cin.exceptions(cin.failbit);

	int n;
	while (cin >> n) {
		if (!n) break;
		string s; read(s);
		bool done = false;

		vector<int> indeg(26);
		vector<vi> g(26);

		rep(i, 1, n) {
			string t; read(t);
			if (done) continue;

			if (s == t || t.substr(0, sz(s)) == s) {
				s = t; continue;
			}

			if (s.substr(0, sz(t)) == t) {
				write("no"); done = true; continue;
			}

			// build edge
			int id = 0;
			while (s[id] == t[id]) ++id;
			int p = s[id] - 'a', q = t[id] - 'a';
			if (find(all(g[p]), q) == g[p].end()) {
				g[p].push_back(q);
				indeg[q]++;
			}

			s = t;
		}

		if (!done) {
			vector<int> ord;
			queue<int> q;
			rep(i, 0, 26) if (!indeg[i]) q.push(i);
			while (!q.empty()) {
				int h = q.front(); q.pop();
				ord.push_back(h);
				for (int e : g[h]) {
					indeg[e]--;
					if (!indeg[e])
						q.push(e);
				}
			}

			write(sz(ord) == 26 ? "yes" : "no");
		}
	}
}

