#include <cstdio>
#include <vector>
#include <algorithm>
using std::vector;
typedef long long LL;
int read() {
int s = 0;
char ch = getchar();
while (ch < '0' || ch > '9')
ch = getchar();
while (ch >= '0' && ch <= '9')
s = s * 10 + ch - 48, ch = getchar();
return s;
}
void write(int x) {
if (x > 9)
write(x / 10);
putchar(x % 10 + 48);
}
const int MOD = 998244353, vIE = 0, tIE = 0, N = 500005;
struct SegTree {
int sz;
vector<LL> val, tag;
void pushdown(int x, int lx, int rx) {
tag[x << 1] = (tag[x << 1] + tag[x]) % MOD;
tag[x << 1 | 1] = (tag[x << 1 | 1] + tag[x]) % MOD;
val[x << 1] = (val[x << 1] + tag[x] * (rx - lx) / 2) % MOD;
val[x << 1 | 1] = (val[x << 1 | 1] + tag[x] * (rx - lx) / 2) % MOD;
tag[x] = tIE;
}
void pushup(int x) {
val[x] = (val[x << 1] + val[x << 1 | 1]) % MOD;
}
void build(int x, int lx, int rx, vector<LL>& a) {
if (lx + 1 == rx) {
val[x] = lx <= int(a.size()) ? a[lx - 1] : vIE;
return ;
}
int m = (lx + rx) >> 1;
build(x << 1, lx, m, a);
build(x << 1 | 1, m, rx, a);
pushup(x);
}
SegTree() {}
SegTree(vector<LL>& a) {
sz = 1;
while (sz < int(a.size()))
sz <<= 1;
val.assign(sz << 1, vIE);
tag.assign(sz << 1, tIE);
build(1, 1, sz + 1, a);
}
void mdf(int x, int lx, int rx, int l, int r, LL v) {
if (rx <= l || r <= lx)
return ;
if (l <= lx && rx <= r) {
val[x] = (val[x] + v * (rx - lx)) % MOD;
tag[x] = (tag[x] + v) % MOD;
return ;
}
pushdown(x, lx, rx);
int m = (lx + rx) >> 1;
mdf(x << 1, lx, m, l, r, v);
mdf(x << 1 | 1, m, rx, l, r, v);
pushup(x);
}
LL qry(int x, int lx, int rx, int l, int r) {
if (rx <= l || r <= lx)
return vIE;
if (l <= lx && rx <= r)
return val[x];
pushdown(x, lx, rx);
int m = (lx + rx) >> 1;
return (qry(x << 1, lx, m, l, r) + qry(x << 1 | 1, m, rx, l, r)) % MOD;
}
} st;
struct Itv {
int l, r, h;
friend bool operator<(Itv x, Itv y) {
return x.h > y.h;
}
} s[N];
int n, m;
vector<LL> a;
int main()
{
n = read(), m = read();
for (int i = 1; i <= m; i++)
s[i].l = read() + 1, s[i].r = read() + 1, s[i].h = read();
a.assign(100005, 0);
for (int i = 1, x; i <= n; i++)
x = read(), a[x] = 1;
st = SegTree(a);
std::sort(s + 1, s + m + 1);
for (int i = 1; i <= m; i++) {
int cnt = st.qry(1, 1, st.sz + 1, s[i].l, s[i].r + 1);
if (s[i].r - s[i].l > 1)
st.mdf(1, 1, st.sz + 1, s[i].l + 1, s[i].r, 0);
st.mdf(1, 1, st.sz + 1, s[i].l, s[i].l + 1, cnt);
st.mdf(1, 1, st.sz + 1, s[i].r, s[i].r + 1, cnt);
}
write(st.qry(1, 1, st.sz + 1, 0, 100002));
return 0;
}