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;

inline int toInt(string s) {int v; istringstream sin(s);sin>>v;return v;}
template<class T> inline string toString(T x) {ostringstream sout;sout<<x;return sout.str();}
template<class T> inline T sqr(T x) {return x*x;}

typedef vector<int> vi;
typedef vector<vi> vvi;
typedef vector<string> vs;
typedef pair<int, int> pii;
typedef long long ll;

#define all(a)  (a).begin(),(a).end()
#define rall(a) (a).rbegin(), (a).rend()
#define pb push_back
#define mp make_pair
#define each(i,c) for(typeof((c).begin()) i=(c).begin(); i!=(c).end(); ++i)
#define exist(s,e) ((s).find(e)!=(s).end())
#define range(i,a,b) for(int i=(a);i<(b);++i)
#define rep(i,n)  range(i,0,n)
#define clr(a,b) memset((a), (b) ,sizeof(a))
#define dump(x)  cerr << #x << " = " << (x) << endl;
#define debug(x) cerr << #x << " = " << (x) << " (L" << __LINE__ << ")" << " " << __FILE__ << endl;

const double eps = 1e-10;
const double pi  = acos(-1.0);
const ll INF =1LL << 62;
const int inf =1 << 29;

string in[510];
bool graph[30][30];

bool insert(string a,string b){
	int n=min(a.size(),b.size());
	rep(i,n){
		if(a[i]==b[i])
			continue;
		int aa=a[i]-'a';
		int bb=b[i]-'a';
		graph[aa][bb]=true;
		return true;
	}
	if(a.size()<=b.size())
		return true;
	return false;
}

vi ans;
bool visited[30];
void dfs(int i){
	visited[i]=true;
	rep(j,26) if(graph[i][j]&&!visited[j]) dfs(j);
	ans.pb(i);
}

bool check(){
	ans.clear();
	rep(i,26) visited[i]=false;
	rep(i,26) if(!visited[i]) dfs(i);
	reverse(ans.begin(),ans.end());
	bool ok=true;
	rep(i,ans.size())rep(j,i) if(graph[ans[i]][ans[j]]) ok=false;
	return ok;
}

int main(void){
	int n;
	while(cin >> n){
		if(n==0)
			break;
		rep(i,28)rep(j,28) graph[i][j]=false;
		rep(i,n) cin >> in[i];
		bool ok=true;
		rep(i,n)rep(j,n){
			if(i>=j) continue;
			ok&=insert(in[i],in[j]);
		}
		ok&=check();
		if(ok)
			puts("yes");
		else
			puts("no");
	}
	return 0;
}