#include <iostream>
#include <iomanip>
#include <vector>
using namespace std;
#define forsn(i, s, n) for (int i = int(s); i < int(n); i++)
#define forn(i, n) forsn(i, 0, n)
#define dforsn(i, s, n) for (int i = int(n) - 1; i >= int(s); i--)
#define dforn(i, n) dforsn(i, 0, n)
#define sz(x) int(x.size())
#define all(x) begin(x), end(x)
typedef pair<int, int> ii;
typedef vector<int> vi;
typedef long double ld;
const int ALPHA = 26;
const int INF = 1e9;
struct Edge {
int u, v, w;
Edge(int a, int b, int c) : u(a), v(b), w(c) {}
};
int id(char x, char y) { return (x - 'a') * ALPHA + (y - 'a'); }
const int NODES = ALPHA * ALPHA;
template<typename T>
void chmax(T &x, T v) {
if (x < v) x = v;
}
template<typename T>
void chmin(T &x, T v) {
if (x > v) x = v;
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
int n;
while (cin >> n) {
if (n == 0) break;
vector<Edge> graph;
graph.reserve(n);
forn(i, n) {
string s;
cin >> s;
int w = sz(s);
if (w < 2) continue;
int u = id(s[0], s[1]);
int v = id(s[w - 2], s[w - 1]);
graph.push_back(Edge(u, v, w));
}
n = sz(graph);
vector<vi> dp(NODES + 1, vi(NODES, -INF));
dp[0] = vi(NODES, 0);
forn(i, NODES) {
forn(j, n) {
Edge &e = graph[j];
if (dp[i][e.u] < 0) continue;
chmax(dp[i + 1][e.v], dp[i][e.u] + e.w);
}
}
ld x = 0;
forn(u, NODES) {
if (dp[NODES][u] < 0) continue;
ld y = INF;
forn(i, NODES) {
if (dp[i][u] < 0) continue;
chmin(y, (dp[NODES][u] - dp[i][u]) / ld(NODES - i));
}
chmax(x, y);
}
if (x < 1) {
cout << "No solution.\n";
} else {
cout << fixed << setprecision(2) << x << "\n";
}
}
return 0;
}