rt,
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=5e3+5;
struct edge{
int to,w;
};
int n,m,s,cnt[N],p,f[N],x[N],y[N],z[N];
double dis[N];
bool vis[N];
vector<edge>e[N];
bool spfa()
{
memset(vis,0,sizeof(vis));
for(int i=1;i<=n;i++)
dis[i]=1e9;
memset(cnt,0,sizeof(cnt));
queue<int>q;
for(int i=1;i<=n;i++)
q.push(i);
dis[s]=0;
vis[s]=true;
while(q.empty()==false)
{
int cur=q.front();
vis[cur]=false;
q.pop();
for(int i=0;i<e[cur].size();i++)
{
int next=e[cur][i].to,w=e[cur][i].w;
if(dis[cur]<dis[next]-w)
{
dis[next]=dis[cur]+w;
cnt[next]=cnt[cur]+1;
if(cnt[next]>=n)
return true;
if(vis[next]==false)
{
vis[next]=true;
q.push(next);
}
}
}
}
return false;
}
bool check(double w)
{
for(int i=1;i<=n;i++)
e[i].clear();
for(int i=1;i<=m;i++)
e[x[i]].push_back((edge){y[i],w*z[i]-f[x[i]]});
return spfa();
}
signed main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
cin>>f[i];
for(int i=1;i<=m;i++)
cin>>x[i]>>y[i]>>z[i];
double l=0,r=1000;
while(r-l>1e-6)
{
double mid=(l+r)/2;
if(check(mid))
l=mid;
else
r=mid;
}
cout<<fixed<<setprecision(2)<<l;
return 0;
}