#include<cstdio>
#include<algorithm>
#include<vector>
#include<set>
#include<map>
#define ct Chtholly_tree
#define Chtholly set<ct>::iterator
#define N 1919810
#define pp 998244353
#define int long long
using namespace std;
int n,m,dp[N],mk[N],tot,ans;
vector<int>p;
map<int,int>mp;
struct line{
int l,r,h;
void in(){scanf("%lld%lld%lld",&l,&r,&h);}
}a[N];
struct Chtholly_tree{
int l,r;
mutable int val;
ct(int a=-1,int b=-1,int c=0){l=a,r=b,val=c;}
bool operator <(const ct &a)const{return l<a.l;}
};
set<ct>st;
Chtholly split(int p){
Chtholly it=st.lower_bound(ct(p,0,0));
if(it!=st.end()&&it->l==p)return it;
it--;ct tmp=*it;st.erase(it);
st.insert(ct(tmp.l,p-1,tmp.val));
return st.insert(ct(p,tmp.r,tmp.val)).first;
}
void assign(int l,int r,int v){
Chtholly right=split(r+1ll),left=split(l);
st.erase(left,right);
st.insert(ct(l,r,v));
}
int find(int aa){
Chtholly r=split(aa+1ll),l=split(aa);
return l->val%pp;
}
bool cmp(line a,line b){return a.h<b.h;}
signed main(){
scanf("%lld%lld",&n,&m);
for(int i=1;i<=m;i++)a[i].in(),st.insert(ct{a[i].l,a[i].r,1});
sort(a+1,a+m+1,cmp);
for(int i=1;i<=m;i++){
int le=find(a[i].l),re=find(a[i].r);
assign(a[i].l,a[i].r,(le+re)%pp);
}
for(int i=1;i<=n;i++){
int a;
scanf("%lld",&a);
ans=(ans+find(a))%pp;
}
printf("%lld",ans);
return 0;
}