#include <bits/stdc++.h>
using namespace std;
long long n, m, l, r, maxx, v[100010], lg[100010], f[100010][110];
double ans, dp[5010][5010];
vector<long long> e[5010];
struct wang {
  long long l, r, mx;
  double p;
} a[5010];
inline long long read() {
  long long x = 0, f = 1;
  char c = getchar();
  while (c < '0' || c > '9') {
    if (c == '-') f = -1;
    c = getchar();
  }
  while (c >= '0' && c <= '9') {
    x = (x << 3) + (x << 1) + (c ^ '0');
    c = getchar();
  }
  return x * f;
}
inline bool mycmp(wang x, wang y) { return x.l == y.l ? x.r > y.r : x.l < y.l; }
long long query(long long l, long long r) {
  long long k = lg[r - l + 1];
  return max(f[l][k], f[r - (1 << k) + 1][k]);
}
void DP(int x) {
  for (int i = 0; i < e[x].size(); i++) DP(e[x][i]);
  dp[x][0] = 1 - a[x].p;
  for (int i = 0; i < e[x].size(); i++) {
    int y = e[x][i];
    dp[x][0] *= dp[y][a[x].mx - a[y].mx];
  }
  for (int i = 1; i <= m; i++) {
    double p1 = 1, p2 = 1;
    for (int j = 0; j < e[x].size(); j++) {
      int y = e[x][j];
      p1 *= dp[y][min(i - a[y].mx + a[x].mx - 1, m)];
      p2 *= dp[y][min(i - a[y].mx + a[x].mx, m)];
    }
    dp[x][i] = a[x].p * p1 + (1 - a[x].p) * p2;
  }
}
int main() {
  n = read();
  m = read();
  for (long long i = 1; i <= n; i++) {
    v[i] = read();
    maxx = max(maxx, v[i]);
    if (i != 1) lg[i] = lg[i >> 1] + 1;
  }
  for (long long i = 1; i <= n; i++) f[i][0] = v[i];
  for (long long j = 1; j < lg[n] + 1; j++)
    for (long long i = 1; i <= n - (1 << j) + 1; i++)
      f[i][j] = max(f[i][j - 1], f[i + (1 << (j - 1))][j - 1]);
  for (long long i = 1; i <= m; i++) {
    a[i].l = read();
    a[i].r = read();
    scanf("%lf", &a[i].p);
    a[i].mx = query(a[i].l, a[i].r);
  }
  a[++m] = (wang){1, n, query(1, n), 0.0};
  sort(a + 1, a + m + 1, mycmp);
  for (int i = 2; i <= m; i++)
    for (int j = i - 1; j >= 1; j--)
      if (a[j].l <= a[i].l && a[i].r <= a[j].r) {
        e[j].push_back(i);
        break;
      }
  DP(1);
  for (int i = 0; i <= m; i++)
    ans += ((dp[1][i] - (!i ? 0 : dp[1][i - 1])) * (i + maxx));
  printf("%.9lf", ans);
  return 0;
}
