#include <bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f;
const int maxn = 550;
int edge[maxn][maxn], num[maxn], v[maxn];
int sumv, sume, n, m;
struct info {
  int sumv, sume;
  int to, vis;
} a[maxn];
struct node {
  int x, y, val;
} b[maxn * maxn];
void dfs(int x) {
  if (v[x]) return;
  v[x] = 1;
  for (int i = 1; i <= n; i++)
    if (edge[x][i] && v[i] == 0) {
      int tv = num[i], te = 0;
      for (int j = 1; j <= n; j++)
        if (v[j]) te += edge[i][j];
      if (sumv * te <= sume * tv) sumv += tv, sume += te, dfs(i);
    }
}
int main() {
  int x, y, val;
  while (~scanf("%d%d", &n, &m)) {
    for (int i = 1; i <= n; i++) scanf("%d", &num[i]);
    memset(edge, 0, sizeof(edge));
    for (int i = 1; i <= n; i++) a[i].vis = 0;
    for (int i = 0; i < m; i++) {
      scanf("%d%d%d", &x, &y, &val);
      b[i].x = x;
      b[i].y = y;
      b[i].val = val;
      edge[x][y] = val;
      edge[y][x] = val;
      if (a[x].vis == 0)
        a[x].sumv = num[x] + num[y], a[x].sume = val, a[x].vis = 1, a[x].to = y;
      else if (a[x].sumv * val < a[x].sume * (num[x] + num[y]))
        a[x].sumv = num[x] + num[y], a[x].sume = val, a[x].to = y;
      if (a[y].vis == 0)
        a[y].sumv = num[x] + num[y], a[y].sume = val, a[y].vis = 1, a[y].to = x;
      else if (a[y].sumv * val < a[y].sume * (num[x] + num[y]))
        a[y].sumv = num[x] + num[y], a[y].sume = val, a[y].to = x;
    }
    if (m == 0) {
      printf("%.15lf\n", 0.0);
      continue;
    }
    int ansv, anse, f = 0;
    for (int i = 0; i < m; i++) {
      memset(v, 0, sizeof(v));
      sumv = num[b[i].x] + num[b[i].y];
      sume = b[i].val;
      v[b[i].x] = 1;
      v[b[i].y] = 1;
      dfs(b[i].x);
      dfs(b[i].y);
      if (f == 0)
        ansv = sumv, anse = sume, f = 1;
      else if (ansv * sume < anse * sumv)
        ansv = sumv, anse = sume;
    }
    printf("%.15lf\n", ansv * 1.0 / (anse * 1.0));
  }
  return 0;
}
