#include <bits/stdc++.h>
using namespace std;
int N, Q;
int initial[100000];
pair<pair<int, int>, double> recs[5001];
double fchance[5002];
double cchance[5002];
int parent[5001];
vector<int> children[5001];
int tmax[5001];
int otmax[5001];
bool gr(int a, int b) {
  return recs[a].first.first <= recs[b].first.first &&
         recs[a].first.second >= recs[b].first.second;
}
bool eq(int a, int b) { return recs[a].first == recs[b].first; }
void gmax(int p) {
  int idx = 0;
  vector<int>& C = children[p];
  for (int i = (0); i < (C.size()); i++) gmax(C[i]);
  for (int i = recs[p].first.first; i <= recs[p].first.second;) {
    if (idx < C.size() && i == recs[C[idx]].first.first) {
      tmax[p] = max(tmax[p], tmax[C[idx]]);
      i = recs[C[idx]].first.second + 1;
      idx++;
    } else {
      tmax[p] = max(tmax[p], initial[i]);
      otmax[p] = max(otmax[p], initial[i]);
      i++;
    }
  }
}
vector<double> solve(int p) {
  vector<double> ans(Q + 1);
  for (int i = (0); i < (Q + 1); i++) ans[i] = 1;
  vector<int>& C = children[p];
  for (int i = (0); i < (C.size()); i++) {
    vector<double> V = solve(C[i]);
    for (int j = ans.size() - 1; j >= 0; j--) {
      int k = j - tmax[C[i]] + tmax[p];
      if (k < V.size() && k >= 0) ans[j] *= V[k];
    }
  }
  for (int i = (0); i < (ans.size()); i++) ans[i] = 1 - ans[i];
  ans[0] = 1;
  for (int i = ans.size() - 2; i >= 0; i--) {
    double x = ans[i];
    ans[i + 1] += (x - ans[i + 1]) * recs[p].second;
  }
  for (int i = (0); i < (ans.size()); i++) ans[i] = 1 - ans[i];
  return ans;
}
int main() {
  for (int i = (0); i < (5002); i++) fchance[i] = 1;
  cchance[0] = 1;
  scanf("%d", &(N)), scanf("%d", &(Q));
  for (int i = (0); i < (N); i++) scanf("%d", &(initial[i]));
  for (int i = (0); i < (Q); i++) {
    int a, b;
    double d;
    scanf("%d", &(a));
    scanf("%d", &(b));
    scanf("%lf", &d);
    recs[i] = make_pair(make_pair(a - 1, b - 1), d);
  }
  sort(recs, recs + Q);
  recs[Q] = make_pair(make_pair(0, N - 1), 0);
  Q++;
  for (int i = (0); i < (Q); i++) {
    int par = -1;
    for (int j = (0); j < (Q); j++)
      if (i != j && gr(j, i)) {
        if (eq(j, i)) {
          if (j > i) {
            par = j;
            break;
          }
        } else if (par == -1 || (gr(par, j) && !eq(par, j)))
          par = j;
      }
    parent[i] = par;
  }
  assert(parent[Q - 1] == -1);
  for (int i = (0); i < (Q - 1); i++) {
    children[parent[i]].push_back(i);
  }
  gmax(Q - 1);
  vector<double> V = solve(Q - 1);
  for (int i = (0); i < (V.size()); i++) V[i] = 1 - V[i];
  double total = 0;
  for (int i = V.size() - 2; i >= 0; i--) {
    total += i * (V[i] - V[i + 1]);
  }
  printf("%.15f\n", total + tmax[Q - 1]);
}
