Problem Statement

We found a dictionary of the Ancient Civilization Mayo (ACM) during excavation of the ruins. After analysis of the dictionary, we revealed they used a language that had not more than 26 letters. So one of us mapped each letter to a different English alphabet and typed all the words in the dictionary into a computer.

How the words are ordered in the dictionary, especially whether they are ordered lexicographically, is an interesting topic to many people. As a good programmer, you are requested to write a program to judge whether we can consider the words to be sorted in a lexicographical order.

Note: In a lexicographical order, a word always precedes other words it is a prefix of. For example, `ab` precedes `abc`, `abde`, and so on.



Input

The input consists of multiple datasets. Each dataset is formatted as follows:


n
string_1
...
string_n


Each dataset consists of n+1 lines. The first line of each dataset contains an integer that indicates n (1 \leq n \leq 500). The i-th line of the following n lines contains string_i, which consists of up to 10 English lowercase letters.

The end of the input is `0`, and this should not be processed.

Output

Print either `yes` or `no` in a line for each dataset, in the order of the input. If all words in the dataset can be considered to be ordered lexicographically, print `yes`. Otherwise, print `no`.

Example

Input

4
cba
cab
b
a
3
bca
ab
a
5
abc
acb
b
c
c
5
abc
acb
c
b
b
0


Output

yes
no
yes
no
#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");
		}
	}
}

