record
#include <bits/stdc++.h>
#define lowbit(x) x & -x
using namespace std;
using ll = long long;
struct p{
int l, r, t;
} pt[100005];
int t, n, k, cnt = 1, a[100005], ls[200005], rs[200005], tr[200005], lzy[200005];
void down(int x, int k, int len){
tr[x] = k * len;
lzy[x] = k;
}
void pushdown(int x, int l, int r){
int mid = (l + r) / 2;
down(ls[x], lzy[x], mid - l + 1);
down(rs[x], lzy[x], r - mid);
lzy[x] = 0;
}
void pushup(int x){
tr[x] = tr[ls[x]] + tr[rs[x]];
}
void build(int x = 1, int L = 1, int R = n){
if(L == R){
down(x, 0, 1);
return;
}
int mid = (L + R) / 2;
ls[x] = ++cnt;
build(ls[x], L, mid);
rs[x] = ++cnt;
build(rs[x], mid + 1, R);
pushup(x);
}
void change(int a, int l, int r, int x = 1, int L = 1, int R = n){
if(R < l || L > r) return;
if(l <= L && R <= r){
down(x, a, R - L + 1);
return;
}
pushdown(x, L, R);
int mid = (L + R) / 2;
change(a, l, r, ls[x], L, mid);
change(a, l, r, rs[x], mid + 1, R);
pushup(x);
}
int query(int l, int r, int x = 1, int L = 1, int R = n){
if(R < l || L > r) return 0;
if(l <= L && R <= r) return tr[x];
pushdown(x, L, R);
int mid = (L + R) / 2;
return query(l, r, ls[x], L, mid) + query(l, r, rs[x], mid + 1, R);
}
bool cmp(p x, p y){
return x.r < y.r;
}
int main(){
cin >> t;
while(t--){
cnt = 1;
cin >> n >> k;
for(int i = 1; i <= n; i++) cin >> a[i];
sort(a + 1, a + n + 1);
build();
for(int i = 1; i <= k; i++){
int l, r, t;
cin >> l >> r >> t;
l = lower_bound(a + 1, a + n + 1, l) - a;
r = upper_bound(a + 1, a + n + 1, r) - a - 1;
pt[i] = {l, r, t};
}
sort(pt + 1, pt + k + 1, cmp);
for(int i = 1; i <= k; i++){
int l = pt[i].l, r = pt[i].r, t = pt[i].t;
if(query(l, r) >= t) continue;
int L = l, R = r - 1;
while(L < R){
int mid = (L + R) / 2;
if(query(l, mid) + r - mid > t) L = mid + 1;
else R = mid;
}
change(1, L + 1, r);
}
cout << n - query(1, n) << '\n';
}
return 0;
}