#include <bits/stdc++.h>
using namespace std;
struct konj {
  double dist;
  int cvor, e, v;
  konj() {}
  konj(int a, double d, int b, int c) {
    cvor = a;
    dist = d;
    v = b;
    e = c;
  }
  friend bool operator<(konj a, konj b) { return a.dist < b.dist; }
};
priority_queue<konj> q;
vector<int> v[1000];
double sol;
int n, m, p[1000], a, b, c, mat[600][600];
bool bio[1000];
int check(int cvor) {
  int k = 0;
  for (int i = 0; i < n; i++) k += mat[cvor][i] * bio[i];
  return k;
}
double bfs(int X) {
  int V = p[X], e = 0;
  while (!q.empty()) q.pop();
  memset(bio, 0, sizeof bio);
  int cvor;
  double dist;
  q.push(konj(X, 0, p[X], 0));
  while (!q.empty()) {
    while (!q.empty() && bio[q.top().cvor] == 1) q.pop();
    if (q.empty()) return 0;
    cvor = q.top().cvor;
    dist = q.top().dist;
    V = q.top().v;
    e = q.top().e;
    sol = max(sol, dist);
    q.pop();
    bio[cvor] = 1;
    for (int i = 0; i < v[cvor].size(); i += 2) {
      int ncvor = v[cvor][i];
      if (bio[ncvor] == 1) continue;
      if ((double)((double)(V + p[ncvor]) / (double)(e + mat[ncvor][cvor])) <
          dist)
        continue;
      q.push(konj(
          ncvor,
          (double)((double)(V + p[ncvor]) / (double)(e + mat[ncvor][cvor])),
          V + p[ncvor], e + mat[ncvor][cvor]));
    }
  }
  if (e == 0) return 0;
  return (double)((double)V / (double)e);
}
int main() {
  scanf("%d %d", &n, &m);
  for (int i = 0; i < n; i++) scanf("%d", &p[i]);
  for (int i = 0; i < m; i++) {
    scanf("%d %d %d", &a, &b, &c);
    a--;
    b--;
    v[a].push_back(b);
    v[b].push_back(a);
    v[a].push_back(c);
    v[b].push_back(c);
    mat[a][b] = mat[b][a] = c;
  }
  for (int i = 0; i < n; i++) sol = max(sol, bfs(i));
  printf("%.9lf\n", sol);
  return 0;
}
