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 <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <queue>
#include <list>
using namespace std;

string str;
string t;
char mapp[30][30];
int n;
int c[50];

bool dfs(int u){
    c[u]=-1;
    for(int v=0;v<26;++v) if(mapp[u][v]==1){
        if(c[v]<0) return false;
            else if(!c[v] && !dfs(v)) return false;
    }
    c[u]=1;
    return true;
}

bool toposort(){
    memset(c,0,sizeof(c));
    for(int u=0;u<26;++u) if(!c[u])
        if(!dfs(u)) return false;
    return true;
}

int main(){

    while(scanf("%d",&n)!=EOF){
        if(n==0) break;
        cin>>t;

        char flag=0;
        memset(mapp,0,sizeof(mapp));

        if(n==1) { printf("yes\n"); continue; }
        for(int i=2;i<=n;++i){
            cin>>str;   int L1=t.size(),L2=str.size();
            for(int j=0;j<min(L1,L2);++j){
                if(flag) break;
                if(t[j]!=str[j]){
                    //cout<<t[j]<<" "<<str[j]<<endl;
                    if(mapp[str[j]-'a'][t[j]-'a']==1) {flag=1; break;}
                        else { mapp[t[j]-'a'][str[j]-'a']=1; break; }
                }
                if(j+1==L2 && L1>L2) {flag=1; break;}
            }
            t=str;
        }

        //for(int i=0;i<=26;++i)
          //  for(int j=0;j<=26;++j) if(mapp[i][j]==1) cout<<i+'a'-1<<" "<<j+'a'-1<<endl;

        if(flag) printf("no\n");
            else{
                if(toposort()) printf("yes\n"); else printf("no\n");
            }
    }
}