#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;
}