1 #include<cmath>
2 #include<cstdio>
3 #include<cstring>
4 #include<algorithm>
5 #define N 105
6 #define M 2010
7 #define sqr(x) ((x)*(x))
8 using namespace std;
9 int n,m,tot,f[N];double ans=1e9;
10 int find(int x){return f[x]==x?x:f[x]=find(f[x]);}
11 struct edge{int x,y,c;double w;}e[M];
12 inline bool operator<(edge x,edge y){return x.w<y.w;}
13 double solve()
14 {
15 for(int i=1;i<=n;i++)f[i]=i;
16 int tot=0;double sum=0;
17 for(int i=1;tot!=n-1;i++)
18 {
19 int fx=find(e[i].x),fy=find(e[i].y);
20 if(fx==fy)continue;
21 tot++;
22 f[fx]=fy;
23 sum+=e[i].w;
24 }
25 return sum;
26 }
27 int main()
28 {
29 scanf("%d%d",&n,&m);
30 for(int i=1;i<=m;i++)
31 scanf("%d%d%d",&e[i].x,&e[i].y,&e[i].c),e[i].w=e[i].c;
32 int Min,Max;
33 sort(e+1,e+m+1);
34 Min=solve();
35 reverse(e+1,e+m+1);
36 Max=solve();
37 for(int i=Min;i<=Max;i++)
38 {
39 double ave=i*1.0/(n-1);
40 for(int j=1;j<=m;j++)
41 e[j].w=sqr(e[j].c-ave);
42 sort(e+1,e+m+1);
43 ans=min(ans,solve());
44 }
45 printf("%.4lf\n",sqrt(ans/(n-1)));
46 }