#include <bits/stdc++.h>
using namespace std;
inline int read() {
  register int x = 0;
  char c = 0;
  while (c < '0' || c > '9') c = getchar();
  while ('0' <= c && c <= '9') x = 10 * x + c - '0', c = getchar();
  return x;
}
const int N = 100005;
const int Q = 5003;
int n, q, lim, maxn;
int a[N], lg[N];
int f[N][20];
inline int Query(int l, int r) {
  int k = lg[r - l + 1];
  return max(f[l][k], f[r - (1 << k) + 1][k]);
}
int to[Q], nxt[Q];
int head[Q], ecnt;
inline void AddEdge(int u, int v) {
  to[++ecnt] = v, nxt[ecnt] = head[u], head[u] = ecnt;
}
struct Seg {
  int l, r, mx;
  double p;
  Seg() {}
  Seg(int _l, int _r, int _x, double _p = 0.0) {
    l = _l, r = _r, mx = _x, p = _p;
  }
  friend bool operator<(Seg x, Seg y) {
    return x.l == y.l ? x.r > y.r : x.l < y.l;
  }
} sg[Q];
double dp[Q][Q];
void Dfs(int u) {
  for (int i = head[u]; i; i = nxt[i]) Dfs(to[i]);
  dp[u][0] = 1 - sg[u].p;
  for (int i = head[u], v = to[i]; i; i = nxt[i], v = to[i])
    dp[u][0] *= dp[v][min(sg[u].mx - sg[v].mx, q)];
  for (int i = 1; i <= q; i++) {
    double p1 = 1, p2 = 1;
    for (int j = head[u]; j; j = nxt[j]) {
      int v = to[j];
      p1 *= dp[v][min(i - sg[v].mx + sg[u].mx - 1, q)];
      p2 *= dp[v][min(i - sg[v].mx + sg[u].mx, q)];
    }
    dp[u][i] = sg[u].p * p1 + (1 - sg[u].p) * p2;
  }
}
int main() {
  for (int i = 2; i < N; i++) lg[i] = lg[i >> 1] + 1;
  n = read(), q = read(), lim = lg[n] + 1;
  for (int i = 1; i <= n; i++) maxn = max(maxn, f[i][0] = a[i] = read());
  for (int s = 1; s <= lim; s++)
    for (int i = 1; i + (1 << (s - 1)) <= n; i++)
      f[i][s] = max(f[i][s - 1], f[i + (1 << (s - 1))][s - 1]);
  for (int i = 1; i <= q; i++) {
    sg[i].l = read(), sg[i].r = read();
    scanf("%lf", &sg[i].p);
    sg[i].mx = Query(sg[i].l, sg[i].r);
  }
  sg[0] = Seg(1, n, Query(1, n));
  sort(sg + 1, sg + q + 1);
  for (int i = 1; i <= q; i++)
    for (int j = i - 1; j >= 0; j--)
      if (sg[j].l <= sg[i].l && sg[i].r <= sg[j].r) {
        AddEdge(j, i);
        break;
      }
  Dfs(0);
  double ans = dp[0][0] * maxn;
  for (int i = 1; i <= q; i++) ans += (dp[0][i] - dp[0][i - 1]) * (i + maxn);
  printf("%.8f\n", ans);
  return 0;
}
