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;

vector<vector<int>> G;

void warshall_floyd(int n) {
    for (int k = 0; k < n; k++){       // 経由する頂点
        for (int i = 0; i < n; i++) {    // 始点
            for (int j = 0; j < n; j++) {  // 終点
                if(G[i][k]!=10&&G[k][j]!=10)G[i][j] = min(G[i][j], G[i][k] + G[k][j]);
            }
        }
    }
}

bool solve(){
    int n;
    cin>>n;
    if(n==0)return false;

    G.assign(26,vector<int>(26,10));
    for (int i = 0; i < 26; ++i) {
        G[i][i]=0;
    }
    vector<string> vs(n);
    for (int i = 0; i < n; ++i) {
        cin>>vs[i];
    }
    for (int i = 1; i < n; ++i) {
        int ind=0;
        if(vs[i]==vs[i-1])continue;
        while(vs[i].size()>=ind+1&&vs[i-1].size()>=ind+1&&vs[i][ind]==vs[i-1][ind]){
            ++ind;
        }
        if(vs[i].size()>=ind+1&&vs[i-1].size()>=ind+1){
            G[vs[i-1][ind]-'a'][vs[i][ind]-'a']=-1;
            //G[vs[i][ind]-'a'][vs[i-1][ind]-'a']=-1;
        }
        else{
            if(vs[i-1].size()>vs[i].size()&&vs[i].front()==vs[i-1].front()){
                cout<<"no"<<endl;
                return true;
            }
        }
    }
    warshall_floyd(26);
/*
    for (int i = 0; i < 26; ++i) {
        for (int j = 0; j < 26; ++j) {
            cout<<G[i][j]<<" ";
        }
        cout<<endl;
    }
*/
    for (int i = 0; i < 26; ++i) {
        if(G[i][i]<0){
            cout<<"no"<<endl;
            return true;
        }
    }
    cout<<"yes"<<endl;
    return true;
}

int main(){
    while(solve());
    return 0;
}
