#include <bits/stdc++.h>
using namespace std;
typedef float ld;
const int N = 1e5 + 100, inF = 2e9, Q = 5005, M = 2 * Q + 50;
int n, q, l[N], r[N], ADD, a[N], maxi[N], seg[N << 2];
bool mark[N];
ld p[N], ans;
vector<int> child[N];
vector<pair<pair<int, int>, pair<ld, int> > > vec;
struct nemidoonam {
  nemidoonam() { fill(dp, dp + M, 0); }
  ld dp[M];
};
nemidoonam node[Q];
inline void change(int l, int r, int val = -inF, int v = 1, int s = 0,
                   int e = n) {
  if (r <= s || e <= l || seg[v] == -inF) return;
  if (l <= s && e <= r) seg[v] = val;
  if (e - s == 1) return;
  int mid = (s + e) >> 1, lc = v << 1, rc = lc | 1;
  change(l, r, val, lc, s, mid);
  change(l, r, val, rc, mid, e);
  seg[v] = max(seg[lc], seg[rc]);
}
inline int get(int l, int r, int v = 1, int s = 0, int e = n) {
  if (r <= s || e <= l) return -inF;
  if (l <= s && e <= r) return seg[v];
  int mid = (s + e) >> 1, lc = v << 1, rc = lc | 1;
  return max(get(l, r, lc, s, mid), get(l, r, rc, mid, e));
}
inline void _merge(int v, int u) {
  for (int i = 0; i < M; i++) node[v].dp[i] *= node[u].dp[i];
}
void dfs(int v) {
  for (int i = max(1, maxi[v] + 1); i < M; i++) node[v].dp[i] = 1;
  for (int u : child[v]) {
    dfs(u);
    _merge(v, u);
  }
  nemidoonam help;
  for (int i = 1; i < M; i++)
    help.dp[i] = p[v] * node[v].dp[i - 1] + (1 - p[v]) * node[v].dp[i];
  node[v] = help;
}
int main() {
  ios::sync_with_stdio(false), cin.tie(0);
  int max_num = 0;
  cin >> n >> q;
  for (int i = 0; i < n; i++) {
    cin >> a[i];
    max_num = max(max_num, a[i]);
  }
  if (max_num > Q) {
    ADD = max_num - Q;
    for (int i = 0; i < n; i++) a[i] = max(a[i] - ADD, 0);
  }
  for (int i = 0; i < n; i++) change(i, i + 1, a[i]);
  for (int i = 0; i < q; i++) {
    cin >> l[i] >> r[i] >> p[i];
    vec.push_back({{--l[i], r[i]}, {p[i], i}});
  }
  vec.push_back({{0, n}, {0, q}});
  sort(vec.begin(), vec.end(),
       [](pair<pair<int, int>, pair<ld, int> > a,
          pair<pair<int, int>, pair<ld, int> > b) {
         return pair<int, int>(a.first.second - a.first.first,
                               a.second.second) <
                pair<int, int>(b.first.second - b.first.first, b.second.second);
       });
  for (pair<pair<int, int>, pair<ld, int> > p : vec) {
    maxi[p.second.second] = get(p.first.first, p.first.second);
    change(p.first.first, p.first.second);
  }
  for (int i = 0; i < vec.size(); i++)
    for (int j = 0; j < i; j++)
      if (mark[vec[j].second.second] == false &&
          vec[i].first.first <= vec[j].first.first &&
          vec[j].first.second <= vec[i].first.second) {
        int dex1 = vec[i].second.second, dex2 = vec[j].second.second;
        child[vec[i].second.second].push_back(vec[j].second.second);
        mark[vec[j].second.second] = true;
      }
  dfs(q);
  for (int i = 1; i < M; i++) ans += (node[q].dp[i] - node[q].dp[i - 1]) * i;
  long double res = ans;
  res += ADD - 1;
  cout << fixed << res;
  return 0;
}
