1 #include<cstdio>
2 #include<cstdlib>
3 #include<cmath>
4 #include<cstring>
5 #include<algorithm>
6 #include<iostream>
7 #include<vector>
8 #include<map>
9 #include<set>
10 #include<queue>
11 #include<string>
12 #define inf 1000000000
13 #define maxn 1000+100
14 #define maxm 5000+100
15 #define eps 0.0005
16 #define ll long long
17 #define pa pair<int,int>
18 using namespace std;
19 inline int read()
20 {
21 int x=0,f=1;char ch=getchar();
22 while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();}
23 while(ch>=‘0‘&&ch<=‘9‘){x=10*x+ch-‘0‘;ch=getchar();}
24 return x*f;
25 }
26 struct edgs{int go,next,w0;double w;}e[maxm];
27 double d[maxn];
28 int n,m,tot,v[maxn],head[maxn];
29 bool mark[maxn],flag;
30 void insert(int x,int y,int z)
31 {
32 e[++tot].go=y;e[tot].w0=z;e[tot].next=head[x];head[x]=tot;
33 }
34 void spfa(int x)
35 {
36 if(mark[x]){flag=1;return;}
37 mark[x]=1;
38 for(int i=head[x],y;i;i=e[i].next)
39 if(d[x]+e[i].w<d[y=e[i].go])
40 {
41 d[y]=d[x]+e[i].w;
42 spfa(y);
43 if(flag)return;
44 }
45 mark[x]=0;
46 }
47 bool check()
48 {
49 for(int i=1;i<=n;i++)d[i]=mark[i]=0;
50 flag=0;
51 for(int i=1;i<=n;i++)
52 {
53 spfa(i);
54 if(flag)return 1;
55 }
56 return 0;
57 }
58 int main()
59 {
60 freopen("input.txt","r",stdin);
61 freopen("output.txt","w",stdout);
62 n=read();m=read();
63 for(int i=1;i<=n;i++)v[i]=read();
64 int x,y,z;
65 while(m--)x=read(),y=read(),z=read(),insert(x,y,z);
66 double l=0,r=20000,mid;
67 while(r-l>=eps)
68 {
69 mid=(l+r)/2;
70 for(int i=1;i<=tot;i++)e[i].w=e[i].w0*mid-v[e[i].go];
71 if(check())l=mid;else r=mid;
72 }
73 printf("%.2lf\n",l);
74 return 0;
75 }