#include <bits/stdc++.h>
using namespace std;
int const N = 1e5 + 10, M = 5e3 + 10, mod = 1e9 + 7;
int n, q, cnt, a[N], h[M], mx[M], st[N][20], lg[N];
double dp[M][M];
struct Node {
  int l, r;
  double p;
  bool operator<(Node const &other) const {
    if (l == other.l)
      return r > other.r;
    else
      return l < other.l;
  }
} rec[M];
struct Edge {
  int t, n;
} tree[M];
void insert(int f, int t) {
  tree[cnt].t = t;
  tree[cnt].n = h[f];
  h[f] = cnt++;
}
void solve(int rt) {
  for (int i = 0; i <= q; i++) dp[rt][i] = 1;
  for (int i = h[rt], t; ~i; i = tree[i].n) {
    solve(t = tree[i].t);
    for (int j = 0, k; j <= q; j++) {
      k = mx[rt] - mx[t] + j;
      dp[rt][j] *= dp[t][min(k, q)];
    }
  }
  for (int i = q, k; i >= 0; i--) {
    dp[rt][i] *= 1 - rec[rt].p;
    if (i) dp[rt][i] += dp[rt][i - 1] * rec[rt].p;
  }
}
inline int rmq(int l, int r) {
  int len = r - l + 1;
  return max(st[l][lg[len]], st[r - (1 << lg[len]) + 1][lg[len]]);
}
int main() {
  cin >> n >> q;
  for (int i = 1; i <= n; i++) cin >> a[i];
  rec[0].l = 1;
  rec[0].r = n;
  rec[0].p = 0;
  for (int i = 1; i <= q; i++) cin >> rec[i].l >> rec[i].r >> rec[i].p;
  sort(rec, rec + q + 1);
  memset(h, -1, sizeof(h));
  for (int i = 1, j; i <= q; i++) {
    for (j = i - 1; rec[j].r < rec[i].r; j--)
      ;
    insert(j, i);
  }
  lg[1] = 0;
  for (int i = 2; i <= n; i++) lg[i] = lg[i - 1] + !((i - 1) & i);
  for (int i = 1; i <= n; i++) st[i][0] = a[i];
  for (int i = 1; i < 20; i++)
    for (int j = 1; j <= n; j++)
      st[j][i] = max(st[j][i - 1],
                     (j + (1 << i - 1)) <= n ? st[j + (1 << i - 1)][i - 1] : 0);
  for (int i = 0, j; i <= q; i++) mx[i] = rmq(rec[i].l, rec[i].r);
  q++;
  solve(0);
  double ans = dp[0][0] * mx[0];
  for (int i = 1; i <= q; i++) ans += (dp[0][i] - dp[0][i - 1]) * (mx[0] + i);
  printf("%.6f\n", ans);
  return 0;
}
