#include <bits/stdc++.h>
using namespace std;
double f[5005][5005], ans = 0;
int n, q, a[100005][20], h[5005], tot = 0;
struct Node {
  int l, r, mx;
  double p;
} v[5005];
struct Edge {
  int x, next;
} e[10005];
int RMQ(int l, int r) {
  if (l > r) swap(l, r);
  int k = log2(r - l + 1);
  return max(a[l][k], a[r - (1 << k) + 1][k]);
}
bool comp(Node a, Node b) { return a.l != b.l ? a.l < b.l : a.r > b.r; }
void add_edge(int x, int y) {
  e[++tot].x = y;
  e[tot].next = h[x], h[x] = tot;
}
void dfs(int x) {
  for (int i = h[x]; i; i = e[i].next) dfs(e[i].x);
  for (int j = 0; j <= q + 1; j++) {
    double tmp1 = j ? v[x].p : 0, tmp2 = 1 - v[x].p;
    for (int i = h[x]; i; i = e[i].next) {
      if (j + v[x].mx - v[e[i].x].mx - 1 >= 0)
        tmp1 *= f[e[i].x][min(q + 1, j + v[x].mx - v[e[i].x].mx - 1)];
      tmp2 *= f[e[i].x][min(q + 1, j + v[x].mx - v[e[i].x].mx)];
    }
    f[x][j] = tmp1 + tmp2;
  }
}
int main() {
  scanf("%d%d", &n, &q);
  for (int i = 1; i <= n; i++) scanf("%d", a[i]);
  for (int j = 1; j <= 18; j++)
    for (int i = 1; i + (1 << j) - 1 <= n; i++)
      a[i][j] = max(a[i][j - 1], a[i + (1 << j - 1)][j - 1]);
  for (int i = 1; i <= q; i++) {
    scanf("%d%d%lf", &v[i].l, &v[i].r, &v[i].p);
    v[i].mx = RMQ(v[i].l, v[i].r);
  }
  v[++q] = (Node){1, n, RMQ(1, n), 0};
  sort(v + 1, v + q + 1, comp);
  for (int i = 2; i <= q; i++)
    for (int j = i - 1; j > 0; j--)
      if (v[j].l <= v[i].l && v[j].r >= v[i].r) {
        add_edge(j, i);
        break;
      }
  dfs(1);
  for (int i = 1; i <= q; i++) ans += (f[1][i] - f[1][i - 1]) * (v[1].mx + i);
  printf("%.8f", ans + f[1][0] * v[1].mx);
}
