#include <bits/stdc++.h>   using namespace std;   long long MOD = 1000000007;   int d[201][201];   pair<pair<int, int>, int> E[20000];   vector<std::pair<int, int> > Intervals;   int n, m;   bool check(int idx, int x) {     int u = E[idx].first.first, v = E[idx].first.second, w = E[idx].second;     Intervals.clear();     for (int i = 0; i < n; ++i) {       int d1 = d[u][i], d2 = d[v][i];       if (d1 > x and d2 > x) return 0;       int a = 0, b = w;       a = min(w, x - d1) + 1;       b = max(0, w - (x - d2)) - 1;       if (d1 <= x and d2 <= x) {         if (a > b)           continue;         else           Intervals.push_back(std::make_pair(a, b));       } else if (d1 <= x) {         if (a <= w) Intervals.push_back(std::make_pair(a, w));       } else {         if (b >= 0) Intervals.push_back(std::make_pair(0, b));       }     }     if (Intervals.size() < 1) return 1;     sort(Intervals.begin(), Intervals.end());     if (Intervals[0].first > 0) return 1;     int maxY = Intervals[0].second;     for (int i = 1; i < Intervals.size(); ++i) {       if (Intervals[i].first > maxY) return 1;       maxY = max(maxY, Intervals[i].second);     }     return maxY < w;   }   int solve(int idx) {     int u = E[idx].first.first, v = E[idx].first.second;     int l = 0, r = 0, m;     for (int i = 0; i < n; ++i) {       r = max(r, min(d[u][i], d[v][i]));     }     r += E[idx].second + 10;     while (r - l > 1) {       m = (l + r) >> 1;       bool f = check(idx, m);       if (f)         r = m;       else         l = m;     }     if (check(idx, l))       return l;     else       return r;   }   int main() {     int u, v, w;     scanf( %d %d , &n, &m);     for (int i = 0; i < (n); ++i)       for (int j = 0; j < (n); ++j) d[i][j] = (i == j ? 0 : MOD);     for (int i = 0; i < (m); ++i) {       scanf( %d %d %d , &u, &v, &w);       u -= 1, v -= 1, w <<= 1;       d[u][v] = d[v][u] = w;       E[i] = std::make_pair(std::make_pair(u, v), w);     }     for (int i = 0; i < n; ++i) {       for (int j = 0; j < n; ++j)         for (int k = 0; k < n; ++k) {           d[j][k] = min(d[j][k], d[j][i] + d[i][k]);         }     }     int ans = MOD;     for (int i = 0; i < (m); ++i) ans = min(ans, solve(i));     cout << ans / 2.0 << endl;     return 0;   }   