#if defined(_USE_PCH_)
#include "pch.hpp"
#else
#include <bits/stdc++.h>
#endif
#define RNG(V_, A_, B_, ...) for(int V_=(A_), V_##_END=(B_) __VA_OPT__(,) __VA_ARGS__; V_<=V_##_END; V_++)
#define IRNG(V_, A_, B_, ...) for(int V_=(A_), V_##_END=(B_) __VA_OPT__(,) __VA_ARGS__; V_>=V_##_END; V_--)
#ifdef _WIN32
#define long int64_t
#endif
#define fir first
#define sec second
#define _UN using namespace
using namespace std;
typedef pair<int,int> pii;
typedef __int128 i128;
const int MAXN=1e6+10; const long INFL=0x3f3f3f3f3f3f3f3f,NINFL=0xc0c0c0c0c0c0c0c0;
int n,m,testid; i128 ans;
struct _At{ int p; long v,c; } A[MAXN];
struct _Bt{ int l,r; long c; } B[MAXN];
long S[MAXN],C1[MAXN],C2[MAXN];
struct SGT1{
#define ls (u<<1)
#define rs (u<<1|1)
static const int MAXN=1<<21;
long mn[MAXN],tag[MAXN]; pair<long,int> mn2[MAXN]; int len;
pair<long,int> add(pair<long,int> x,long a){ return {x.fir+a,x.sec}; }
void pushup(int u){
mn[u]=min(mn[ls]+tag[ls],mn[rs]+tag[rs]);
mn2[u]=min(add(mn2[ls],tag[ls]),add(mn2[rs],tag[rs]));
}
void init(){
for(len=1; len<(m+2); len*=2);
fill_n(mn,len*2,0),fill_n(tag,len*2,0);
RNG(i,0,len-1) mn2[i+len]={0,-i};
IRNG(u,len-1,1) pushup(u);
}
void upd(int l,int r,long x){
int u=len+l-1,v=len+r+1;
for(; u^v^1; u>>=1,v>>=1,pushup(u),pushup(v)){
if(~u&1) tag[u^1]+=x;
if( v&1) tag[v^1]+=x;
}
for(; u; u>>=1) pushup(u);
}
long qry(int l,int r){
long retl=INFL,retr=INFL;
int u=len+l-1,v=len+r+1;
for(; u^v^1; u>>=1,v>>=1,retl+=tag[u],retr+=tag[v]){
if(~u&1) retl=min(retl,mn[u^1]+tag[u^1]);
if( v&1) retr=min(retr,mn[v^1]+tag[v^1]);
}
retl=min(retl,retr);
for(u>>=1; u; u>>=1) retl+=tag[u];
return retl;
}
pair<long,int> qry2(int l,int r){
pair<long,int> retl={INFL,0},retr={INFL,0};
int u=len+l-1,v=len+r+1;
for(; u^v^1; u>>=1,v>>=1,retl=add(retl,tag[u]),retr=add(retr,tag[v])){
if(~u&1) retl=min(retl,add(mn2[u^1],tag[u^1]));
if( v&1) retr=min(retr,add(mn2[v^1],tag[v^1]));
}
retl=min(retl,retr);
for(u>>=1; u; u>>=1) retl=add(retl,tag[u]);
return retl;
}
int find(int r){
auto x=qry2(1,r);
assert(x.fir==0);
return -x.sec;
}
#undef ls
#undef rs
} sgt1;
struct SGT2{
#define ls (u<<1)
#define rs (u<<1|1)
static const int MAXN=1<<21;
int len; pair<long,int> mn[MAXN];
void init(){
for(len=1; len<(n+2); len*=2);
fill_n(mn,len*2,{INFL,0});
}
void upd(int i,long x){
int u=i+len; mn[u]={C1[i]?A[i].v:INFL,i};
for(u>>=1; u; u>>=1) mn[u]=min(mn[ls],mn[rs]);
}
pair<long,int> qry(int l,int r){
pair<long,int> ret{INFL,0};
for(int u=len+l-1,v=len+r+1; u^v^1; u>>=1,v>>=1){
if(~u&1) ret=min(ret,mn[u^1]);
if( v&1) ret=min(ret,mn[v^1]);
}
return ret;
}
#undef ls
#undef rs
} sgt2;
struct SGT3{
#define ls (u<<1)
#define rs (u<<1|1)
static const int MAXN=1<<21;
int len; long mn[MAXN],tag[MAXN];
void pushup(int u){ mn[u]=min(mn[ls]+tag[ls],mn[rs]+tag[rs]); }
void init(){
for(len=1; len<(m+2); len*=2);
fill_n(mn,len*2,0),fill_n(tag,len*2,0);
}
void upd(int l,int r){
int u=len+l-1,v=len+r+1;
for(; u^v^1; u>>=1,v>>=1,pushup(u),pushup(v)){
if(~u&1) tag[u^1]+=x;
if( v&1) tag[v^1]+=x;
}
for(; u; u>>=1) pushup(u);
}
long qry(int i){
int u=len+i;
auto ret=mn[u];
for(; u; u>>=1) ret+=tag[u];
return tag;
}
int find(long x){
int u=1;
while(u<len){
x-=tag[u];
if(mn[rs]+tag[rs]>=x) u=rs;
else u=ls;
}
return u-len;
}
#undef ls
#undef rs
} sgt3;
struct BIT{
long A[MAXN];
void init(){ fill_n(A+1,n,0); }
void upd(int i,long x){
for(; i<=n; i+=i&-i) A[i]+=x;
}
void upd(int l,int r,int x){ upd(l,x),upd(r+1,-x); }
long qry(int i){
if(!i) return 0;
long ret=0;
for(; i; i-=i&-i) ret+=A[i];
return ret;
}
} bit1;
ostream& operator<<(ostream& os,i128 x){
if(!x){ return os<<'0'; }
if(x<0) os<<'-',x=-x;
char buf[50]; int i=0;
while(x) buf[i++]=char(x%10+'0'),x/=10;
buf[i]=0;
reverse(buf,buf+i);
return os<<buf;
}
void case_main(){
cin>>n>>m;
RNG(i,1,n) cin>>A[i].p>>A[i].v>>A[i].c,S[i]=S[i-1]+A[i].c;
RNG(i,1,m) cin>>B[i].l>>B[i].r>>B[i].c;
sort(A+1,A+n+1,[](auto x,auto y){ return x.p<y.p; });
sort(B+1,B+m+1,[](auto x,auto y){ return x.l!=y.l?x.l<y.l:x.r<y.r; });
sgt1.init(),bit1.init();
RNG(i,1,m) C1[i]=B[i].c;
auto fd1=[](int i)->pii{
int l2=1,r2=m,p1=0;
while(l2<=r2){
auto mid=(l2+r2)/2;
if(B[mid].r>=i) p1=mid,r2=mid-1;
else l2=mid+1;
}
l2=1,r2=m; int p2=0;
while(l2<=r2){
auto mid=(l2+r2)/2;
if(B[mid].l<=i) p2=mid,l2=mid+1;
else r2=mid-1;
}
if(p1&&p2&&B[p1].l<=i&&i<=B[p1].r&&B[p2].l<=i&&i<=B[p2].r) return {p1,p2};
return {0,0};
};
ans=0;
long cur=0;
RNG(i,1,n,j=1){
auto [l,r]=fd1(A[i].p);
if(!l||l>r) continue;
while(j<l) sgt3.upd(j,j,cur),j++;
while(C2[i]<A[i].c){
if(j>r){
assert(j==r+1);
int p=sgt1.find(r);
int x=bit.qry(p);
int y=lower_bound(S+1,S+n+1,x)-S;
if(S[y-1]+C2[y]<=x) y++;
assert(y<=i);
int k=sgt2.qry(y,i).sec;
if(A[k].v>=A[i].v) break;
int q=sgt3.find(y);
auto z=min({S[y-1]+C2[y]-x,C2[y],sgt1.qry(p+1,r)});
assert(z);
ans+=(A[i].v-A[k].v)*z;
cur+=z;
C2[y]-=z,C2[i]+=z;
if(k<r) sgt1.upd(k+1,r,-z);
if(l<r) sgt1.upd(l+1,r,z);
sgt2.upd(y),sgt2.upd(i);
}else{
auto y=min(A[i].c-C2[i],C1[j]);
ans+=A[i].v*y;
cur+=y;
C1[j]-=y,C2[i]+=y;
if(l<j) sgt1.upd(l+1,j,y);
sgt2.upd(i);
if(!C1[j]) sgt3.upd(j,j,cur),j++;
}
}
}
cout<<ans<<"\n";
}
int main(){
#if defined(_LOCAL_)
freopen("in","r",stdin);
freopen("out","w",stdout);
// freopen("/dev/null","w",stderr);
#else
// freopen("k.in","r",stdin);
// freopen("k.out","w",stdout);
#endif
ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
int cas; cin>>testid>>cas;
RNG(_,1,cas) case_main();
}