#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;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8aW9tYW5pcD4KI2luY2x1ZGUgPHZlY3Rvcj4gCgp1c2luZyBuYW1lc3BhY2Ugc3RkOwogCiNkZWZpbmUgZm9yc24oaSwgcywgbikgZm9yIChpbnQgaSA9IGludChzKTsgaSA8IGludChuKTsgaSsrKQojZGVmaW5lIGZvcm4oaSwgbikgZm9yc24oaSwgMCwgbikKI2RlZmluZSBkZm9yc24oaSwgcywgbikgZm9yIChpbnQgaSA9IGludChuKSAtIDE7IGkgPj0gaW50KHMpOyBpLS0pCiNkZWZpbmUgZGZvcm4oaSwgbikgZGZvcnNuKGksIDAsIG4pCgojZGVmaW5lIHN6KHgpIGludCh4LnNpemUoKSkKI2RlZmluZSBhbGwoeCkgYmVnaW4oeCksIGVuZCh4KQoKdHlwZWRlZiBwYWlyPGludCwgaW50PiBpaTsKdHlwZWRlZiB2ZWN0b3I8aW50PiB2aTsKdHlwZWRlZiBsb25nIGRvdWJsZSBsZDsKCmNvbnN0IGludCBBTFBIQSA9IDI2Owpjb25zdCBpbnQgSU5GID0gMWU5OwoKc3RydWN0IEVkZ2UgewogICAgaW50IHUsIHYsIHc7CiAgICBFZGdlKGludCBhLCBpbnQgYiwgaW50IGMpIDogdShhKSwgdihiKSwgdyhjKSB7fQp9OwoKaW50IGlkKGNoYXIgeCwgY2hhciB5KSB7IHJldHVybiAoeCAtICdhJykgKiBBTFBIQSArICh5IC0gJ2EnKTsgfQoKY29uc3QgaW50IE5PREVTID0gQUxQSEEgKiBBTFBIQTsKCnRlbXBsYXRlPHR5cGVuYW1lIFQ+CnZvaWQgY2htYXgoVCAmeCwgVCB2KSB7CiAgICBpZiAoeCA8IHYpIHggPSB2Owp9Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgp2b2lkIGNobWluKFQgJngsIFQgdikgewogICAgaWYgKHggPiB2KSB4ID0gdjsKfQoKaW50IG1haW4oKSB7CiAgICBpb3M6OnN5bmNfd2l0aF9zdGRpbygwKTsgICAgICAgICAgICAgICAgCiAgICBjaW4udGllKDApOyBjb3V0LnRpZSgwKTsKICAgIAogICAgaW50IG47CiAgICB3aGlsZSAoY2luID4+IG4pIHsKICAgICAgICBpZiAobiA9PSAwKSBicmVhazsKICAgICAgICB2ZWN0b3I8RWRnZT4gZ3JhcGg7CiAgICAgICAgZ3JhcGgucmVzZXJ2ZShuKTsKICAgICAgICBmb3JuKGksIG4pIHsKICAgICAgICAgICAgc3RyaW5nIHM7CiAgICAgICAgICAgIGNpbiA+PiBzOwogICAgICAgICAgICBpbnQgdyA9IHN6KHMpOwogICAgICAgICAgICBpZiAodyA8IDIpIGNvbnRpbnVlOwogICAgICAgICAgICBpbnQgdSA9IGlkKHNbMF0sIHNbMV0pOwogICAgICAgICAgICBpbnQgdiA9IGlkKHNbdyAtIDJdLCBzW3cgLSAxXSk7CiAgICAgICAgICAgIGdyYXBoLnB1c2hfYmFjayhFZGdlKHUsIHYsIHcpKTsKICAgICAgICB9CiAgICAgICAgbiA9IHN6KGdyYXBoKTsKICAgICAgICB2ZWN0b3I8dmk+IGRwKE5PREVTICsgMSwgdmkoTk9ERVMsIC1JTkYpKTsKICAgICAgICBkcFswXSA9IHZpKE5PREVTLCAwKTsKICAgICAgICBmb3JuKGksIE5PREVTKSB7CiAgICAgICAgICAgIGZvcm4oaiwgbikgewogICAgICAgICAgICAgICAgRWRnZSAmZSA9IGdyYXBoW2pdOwogICAgICAgICAgICAgICAgaWYgKGRwW2ldW2UudV0gPCAwKSBjb250aW51ZTsKICAgICAgICAgICAgICAgIGNobWF4KGRwW2kgKyAxXVtlLnZdLCBkcFtpXVtlLnVdICsgZS53KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBsZCB4ID0gMDsKICAgICAgICBmb3JuKHUsIE5PREVTKSB7CiAgICAgICAgICAgIGlmIChkcFtOT0RFU11bdV0gPCAwKSBjb250aW51ZTsKICAgICAgICAgICAgbGQgeSA9IElORjsKICAgICAgICAgICAgZm9ybihpLCBOT0RFUykgewogICAgICAgICAgICAgICAgaWYgKGRwW2ldW3VdIDwgMCkgY29udGludWU7CiAgICAgICAgICAgICAgICBjaG1pbih5LCAoZHBbTk9ERVNdW3VdIC0gZHBbaV1bdV0pIC8gbGQoTk9ERVMgLSBpKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2htYXgoeCwgeSk7CiAgICAgICAgfQogICAgICAgIGlmICh4IDwgMSkgewogICAgICAgICAgICBjb3V0IDw8ICJObyBzb2x1dGlvbi5cbiI7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY291dCA8PCBmaXhlZCA8PCBzZXRwcmVjaXNpb24oMikgPDwgeCA8PCAiXG4iOwogICAgICAgIH0KICAgIH0KICAgIAogICAgcmV0dXJuIDA7Cn0K