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;
typedef long long ll;
typedef pair<int,int> pii;
#define rep(i,n) for(ll i=0;i<(ll)(n);i++)
#define all(a)  (a).begin(),(a).end()
#define vi vector<int>
#define pb push_back
#define INF 999999999
//#define INF (1LL<<59)
 
bool hasCircle;
 
bool add_edge(string a,string b,set<int> graph[30]){
    bool flag = true;
    rep( i , min(a.size(),b.size()) ){
        if(a[i]!=b[i]){
            graph[ b[i]-'a' ].insert( a[i]-'a' );
//            cout<<b[i]<<">"<<a[i]<<endl;
            flag=false;
            break;
        }
    }
    if(flag){
        if(a.size()>b.size()){
            return false;
        }
    }
    return true;
}
 
 
void dfs(int pos,bool used[30],set<int> graph[30]){
    if( used[pos] ){    //??¢????????????????????????
//        cout<<pos<<endl;
        hasCircle=true; //????????°???true???????????????
        return ;
    }
    
    used[pos]=true;
    for(auto &to:graph[pos]){
        dfs(to,used,graph);
    }
    used[pos]=false;
}
 
 
int main(){
    int n;
    while(cin>>n&&n){
        vector<string> s(n);
        rep(i,n){
            cin>>s[i];
        }
        
        set<int> graph[30];
        
        rep(i,n){
            for(int j=i+1;j<n;j++){
                if( add_edge(s[i],s[j],graph) == false ){
                    cout<<"no"<<endl;
                    goto next;
                }
            }
        }
        
//        rep(i,26){
//            for(auto &elm:graph[i]){
//                cout<<i<<"->"<<elm<<endl;
//            }
//        }
        
        
        hasCircle = false;
        rep(i,26){
            bool used[30];
            rep(j,30)used[j]=false;
            dfs(i,used,graph);
            if(hasCircle)break;
        }
        if( hasCircle )cout<<"no"<<endl;
        else cout<<"yes"<<endl;
        
        next:;
    }
    
}