#include <bits/stdc++.h>   using namespace std;   const int N = 211, M = N * N / 2;   int u[M], v[M], w[M];   int f[N][N];   bool check(int n, int m, int lim) {     for (int i = 1; i <= m; i++) {       vector<pair<int, int>> v;       bool t = 1;       for (int j = 1; j <= n; j++) {         int l = f[j][u[i]], r = f[j][::v[i]];         if (lim >= l && lim >= r) {           if (2 * lim - l - r >= w[i]) {             v.push_back({0, 1});             v.push_back({w[i] + 1, -1});           } else {             v.push_back({0, 1});             v.push_back({min(w[i], lim - l) + 1, -1});             v.push_back({w[i] - min(w[i], lim - r), 1});             v.push_back({w[i] + 1, -1});           }         } else if (lim >= l) {           v.push_back({0, 1});           v.push_back({min(w[i], lim - l) + 1, -1});         } else if (lim >= r) {           v.push_back({w[i] - min(w[i], lim - r), 1});           v.push_back({w[i] + 1, -1});         } else {           t = 0;           break;         }       }       if (!t) continue;       sort(v.begin(), v.end());       int cnt = 0;       for (auto e : v) {         cnt += e.second;         if (cnt == n) return 1;       }     }     return 0;   }   int main() {     ios ::sync_with_stdio(0);     int n, m;     cin >> n >> m;     memset(f, 0x3f, sizeof f);     for (int i = 1; i <= n; i++) f[i][i] = 0;     for (int i = 1; i <= m; i++) {       cin >> u[i] >> v[i] >> w[i];       w[i] *= 2;       f[u[i]][v[i]] = f[v[i]][u[i]] = w[i];     }     for (int k = 1; k <= n; k++)       for (int i = 1; i <= n; i++)         for (int j = 1; j <= n; j++) f[i][j] = min(f[i][j], f[i][k] + f[k][j]);     int l = 0, r = 1e8L;     while (l + 1 < r) {       int im = (l + r) / 2;       if (check(n, m, im - 1))         r = im;       else         l = im;     }     cout << fixed << setprecision(1);     cout << l / 2.0 <<   n ;   }   