//这里填你的代码^^
//注意代码要放在两组三个点之间,才可以正确显示代码高亮哦~
//优化:优化点数 只看两个字符最多就是26*26个点
//时间复杂度大概是1e8但是过不了呢
//郑老师和阿梓一样可爱^_^
#include <bits/stdc++.h>
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#pragma GCC target("avx,sse2,sse3,sse4,mmx")
#pragma GCC optimize("Ofast")
#pragma GCC optimize("inline")
#pragma GCC optimize("-fgcse")
#pragma GCC optimize("-fgcse-lm")
#pragma GCC optimize("-fipa-sra")
#pragma GCC optimize("-ftree-pre")
#pragma GCC optimize("-ftree-vrp")
#pragma GCC optimize("-fpeephole2")
#pragma GCC optimize("-ffast-math")
#pragma GCC optimize("-fsched-spec")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("-falign-jumps")
#pragma GCC optimize("-falign-loops")
#pragma GCC optimize("-falign-labels")
#pragma GCC optimize("-fdevirtualize")
#pragma GCC optimize("-fcaller-saves")
#pragma GCC optimize("-fcrossjumping")
#pragma GCC optimize("-fthread-jumps")
#pragma GCC optimize("-funroll-loops")
#pragma GCC optimize("-fwhole-program")
#pragma GCC optimize("-freorder-blocks")
#pragma GCC optimize("-fschedule-insns")
#pragma GCC optimize("inline-functions")
#pragma GCC optimize("-ftree-tail-merge")
#pragma GCC optimize("-fschedule-insns2")
#pragma GCC optimize("-fstrict-aliasing")
#pragma GCC optimize("-fstrict-overflow")
#pragma GCC optimize("-falign-functions")
#pragma GCC optimize("-fcse-skip-blocks")
#pragma GCC optimize("-fcse-follow-jumps")
#pragma GCC optimize("-fsched-interblock")
#pragma GCC optimize("-fpartial-inlining")
#pragma GCC optimize("no-stack-protector")
#pragma GCC optimize("-freorder-functions")
#pragma GCC optimize("-findirect-inlining")
#pragma GCC optimize("-fhoist-adjacent-loads")
#pragma GCC optimize("-frerun-cse-after-loop")
#pragma GCC optimize("inline-small-functions")
#pragma GCC optimize("-finline-small-functions")
#pragma GCC optimize("-ftree-switch-conversion")
#pragma GCC optimize("-foptimize-sibling-calls")
#pragma GCC optimize("-fexpensive-optimizations")
#pragma GCC optimize("-funsafe-loop-optimizations")
#pragma GCC optimize("inline-functions-called-once")
#pragma GCC optimize("-fdelete-null-pointer-checks")
using namespace std;
const int mod = 998244353;
const int N = 5e5 + 10;
//const int M = 998244353;
//#define int long long
#define db double
int up(int a,int b){return a<0?a/b:(a+b-1)/b;}
#define endl " \n"
#define all(x) (x).begin(),(x).end()
#define YES {cout<<"YES"<<endl;return;}
#define NO {cout<<"NO"<<endl;return;}
#define _ 0
#define pi acos(-1)
#define INF 0x3f3f3f3f3f3f3f3f
#define PII pair<int,int>
#define fast ios::sync_with_stdio(false);cin.tie(0);
int n;
vector<pair<int,db>>g[1010];
bool check(db mid){ //676*10000*log
queue<int>q;
for(int i=0;i<=676;i++)if(g[i].size())q.push(i);
vector<int>cnt(1010),st(1010);
vector<db>dist(1010);
int count=0;
while(q.size()){
auto u=q.front();q.pop();
if(st[u])continue;
st[u]=1;
for(auto [v,W]:g[u]){
db c=mid-W;
if(dist[v]>dist[u]+c){
dist[v]=dist[u]+c;
cnt[v]=cnt[u]+1;
if(++count>=10000)return true;
if(cnt[v]>=676){
//cout<<"true:"<<mid<<endl;
return true;
}
q.push(v);
st[v]=0;
}
}
}
//cout<<"false:"<<mid<<endl;
return false;
}
void solve(){
while(cin>>n,n){
for(int i=0;i<=676;i++){
g[i].clear();
}
for(int i=1;i<=n;i++){
string s;cin>>s;
if(s.size()<2)continue;
int v=(s[0]-'a')*26+(s[1]-'a'),u=(s[s.size()-2]-'a')*26+s.back()-'a';
//cout<<u<<' '<<v<<' '<<s.size()<<endl;
g[u].push_back({v,s.size()});
}
db l=0,r=1000;
if(!check(0)){
cout<<"No solution"<<endl;
continue;
}
while(r-l>=1e-4){
db mid=(l+r)/2;
if(check(mid))l=mid;
else r=mid;
}
printf("%.2f\n",l);
}
}
signed main(){
fast
int t;t=1;//cin>>t;
while(t--) {
//run();
solve();
}
return ~~(0^_^0);
}