#include <bits/stdc++.h>
using namespace std;
#define int long long
vector<pair<int, int>> g[100005];
int pri[100005];
int dp[100005];
bool visited[100005];
void create() {
pri[1] = 1;
for (int i = 4; i <= 100000; i += 2)
pri[i] = 1;
for (int i = 3; i * i <= 100000; i += 2) {
if (pri[i]) continue;
for (int j = i * i; j <= 100000; j += i)
pri[j] = 1;
}
}
bool dfs(int u, int target) {
visited[u] = true;
if (u == target) return true;
for (auto it : g[u]) {
int v = it.first;
int w = it.second;
if (!visited[v]) {
dp[v] = min(dp[u], w);
if (dfs(v, target)) return true;
}
}
return false;
}
signed main() {
int n, m;
cin >> n >> m;
create();
for (int i = 1; i <= m; ++i) {
int x, y, z;
cin >> x >> y >> z;
g[x].push_back({y, z});
g[y].push_back({x, z});
}
vector<int> primes = {1};
for (int i = 2; i <= n; ++i)
if (pri[i] == 0) primes.push_back(i);
primes.push_back(1);
set<pair<int, int>> pi;
for (int i = 0; i < (int)primes.size(); ++i) {
for (int j = i + 1; j < (int)primes.size(); ++j) {
int a = primes[i], b = primes[j];
for (int k = 1; b * k <= n; ++k)
if (k % a != 0)
pi.insert({min(a, b * k), max(a, b * k)});
for (int k = 1; a * k <= n; ++k)
if (k % b != 0)
pi.insert({min(a * k, b), max(a * k, b)});
}
}
int sum = 0;
for (auto it : pi) {
int u = it.first, v = it.second;
fill(dp, dp + n + 1, LLONG_MAX);
fill(visited, visited + n + 1, false);
dp[v] = LLONG_MAX;
dfs(v, u);
sum += dp[u];
}
cout << fixed << setprecision(2) << (double)sum / pi.size() << '\n';
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiNkZWZpbmUgaW50IGxvbmcgbG9uZwoKdmVjdG9yPHBhaXI8aW50LCBpbnQ+PiBnWzEwMDAwNV07CmludCBwcmlbMTAwMDA1XTsKaW50IGRwWzEwMDAwNV07CmJvb2wgdmlzaXRlZFsxMDAwMDVdOwoKdm9pZCBjcmVhdGUoKSB7CiAgICBwcmlbMV0gPSAxOwogICAgZm9yIChpbnQgaSA9IDQ7IGkgPD0gMTAwMDAwOyBpICs9IDIpCiAgICAgICAgcHJpW2ldID0gMTsKICAgIGZvciAoaW50IGkgPSAzOyBpICogaSA8PSAxMDAwMDA7IGkgKz0gMikgewogICAgICAgIGlmIChwcmlbaV0pIGNvbnRpbnVlOwogICAgICAgIGZvciAoaW50IGogPSBpICogaTsgaiA8PSAxMDAwMDA7IGogKz0gaSkKICAgICAgICAgICAgcHJpW2pdID0gMTsKICAgIH0KfQoKYm9vbCBkZnMoaW50IHUsIGludCB0YXJnZXQpIHsKICAgIHZpc2l0ZWRbdV0gPSB0cnVlOwogICAgaWYgKHUgPT0gdGFyZ2V0KSByZXR1cm4gdHJ1ZTsKICAgIGZvciAoYXV0byBpdCA6IGdbdV0pIHsKICAgICAgICBpbnQgdiA9IGl0LmZpcnN0OwogICAgICAgIGludCB3ID0gaXQuc2Vjb25kOwogICAgICAgIGlmICghdmlzaXRlZFt2XSkgewogICAgICAgICAgICBkcFt2XSA9IG1pbihkcFt1XSwgdyk7CiAgICAgICAgICAgIGlmIChkZnModiwgdGFyZ2V0KSkgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIGZhbHNlOwp9CgpzaWduZWQgbWFpbigpIHsKICAgIGludCBuLCBtOwogICAgY2luID4+IG4gPj4gbTsKICAgIGNyZWF0ZSgpOwogICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbTsgKytpKSB7CiAgICAgICAgaW50IHgsIHksIHo7CiAgICAgICAgY2luID4+IHggPj4geSA+PiB6OwogICAgICAgIGdbeF0ucHVzaF9iYWNrKHt5LCB6fSk7CiAgICAgICAgZ1t5XS5wdXNoX2JhY2soe3gsIHp9KTsKICAgIH0KCiAgICB2ZWN0b3I8aW50PiBwcmltZXMgPSB7MX07CiAgICBmb3IgKGludCBpID0gMjsgaSA8PSBuOyArK2kpCiAgICAgICAgaWYgKHByaVtpXSA9PSAwKSBwcmltZXMucHVzaF9iYWNrKGkpOwogICAgcHJpbWVzLnB1c2hfYmFjaygxKTsKCiAgICBzZXQ8cGFpcjxpbnQsIGludD4+IHBpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCAoaW50KXByaW1lcy5zaXplKCk7ICsraSkgewogICAgICAgIGZvciAoaW50IGogPSBpICsgMTsgaiA8IChpbnQpcHJpbWVzLnNpemUoKTsgKytqKSB7CiAgICAgICAgICAgIGludCBhID0gcHJpbWVzW2ldLCBiID0gcHJpbWVzW2pdOwogICAgICAgICAgICBmb3IgKGludCBrID0gMTsgYiAqIGsgPD0gbjsgKytrKQogICAgICAgICAgICAgICAgaWYgKGsgJSBhICE9IDApCiAgICAgICAgICAgICAgICAgICAgcGkuaW5zZXJ0KHttaW4oYSwgYiAqIGspLCBtYXgoYSwgYiAqIGspfSk7CiAgICAgICAgICAgIGZvciAoaW50IGsgPSAxOyBhICogayA8PSBuOyArK2spCiAgICAgICAgICAgICAgICBpZiAoayAlIGIgIT0gMCkKICAgICAgICAgICAgICAgICAgICBwaS5pbnNlcnQoe21pbihhICogaywgYiksIG1heChhICogaywgYil9KTsKICAgICAgICB9CiAgICB9CgogICAgaW50IHN1bSA9IDA7CiAgICBmb3IgKGF1dG8gaXQgOiBwaSkgewogICAgICAgIGludCB1ID0gaXQuZmlyc3QsIHYgPSBpdC5zZWNvbmQ7CiAgICAgICAgZmlsbChkcCwgZHAgKyBuICsgMSwgTExPTkdfTUFYKTsKICAgICAgICBmaWxsKHZpc2l0ZWQsIHZpc2l0ZWQgKyBuICsgMSwgZmFsc2UpOwogICAgICAgIGRwW3ZdID0gTExPTkdfTUFYOwogICAgICAgIGRmcyh2LCB1KTsKICAgICAgICBzdW0gKz0gZHBbdV07CiAgICB9CgogICAgY291dCA8PCBmaXhlZCA8PCBzZXRwcmVjaXNpb24oMikgPDwgKGRvdWJsZSlzdW0gLyBwaS5zaXplKCkgPDwgJ1xuJzsKICAgIHJldHVybiAwOwp9Cg==