#include<bits/stdc++.h>
#define inf 1145141919810000
#define ll long long
#define mem(x,y) memset(x,y,sizeof x)
using namespace std;
struct edge{
	int t,next;
	ll cst;
	int rev;
};
vector<edge>G[110000];
void add(int f,int t,int next,ll cst){
	G[f].push_back((edge){t,next,cst,(int)G[t].size()});
	G[t].push_back((edge){f,0,-cst,(int)G[f].size()-1});
}
bool used[110000];
ll dis[110000];
int prv[110000],pre[110000],S,T;
bool SPFA(){
	for(int i=0;i<=T;i++)dis[i]=-inf;
	queue<int>q;
	q.push(0);
	dis[0]=0;
	used[0]=true;
	while(!q.empty()){
		int x=q.front();
		q.pop();
		used[x]=false;
		for(int i=0;i<(int)G[x].size();i++){
			edge &e=G[x][i];
			if(e.next && dis[x]+e.cst>dis[e.t]){
				dis[e.t]=dis[x]+e.cst;
				prv[e.t]=x;
				pre[e.t]=i;
				if(!used[e.t]) used[e.t]=1,q.push(e.t);
			}
		}
	}
	return (dis[T]!=-inf);
}
int n,m,lx[210],rx[210],ly[210],ry[210],x[210],y[210];
ll v[210],ans;
ll MCMF(){
	ll nowans=0;
	while(SPFA()){
		int nowp=T;
		while(nowp){
			edge &e=G[prv[nowp]][pre[nowp]];
			e.next--;
			G[e.t][e.rev].next++;
			nowp=prv[nowp];
		}
		nowans+=dis[T];
	}
	return nowans;
}
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++) scanf("%d%d%lld",&x[i],&y[i],&v[i]);
	scanf("%d",&m);
	for(int i=1;i<=n;i++) rx[i]=ry[i]=110;
	for(int i=1;i<=m;i++){
		int a,b;char cc;
		scanf("%s%d%d",&cc,&a,&b);
		if(cc=='L')lx[b+1]=max(lx[b+1],a);
		if(cc=='R')rx[b+1]=min(rx[b+1],a);
		if(cc=='D')ly[b+1]=max(ly[b+1],a);
		if(cc=='U')ry[b+1]=min(ry[b+1],a);
	}
	for(int i=2;i<=n;i++) lx[i]=max(lx[i],lx[i-1]),rx[i]=min(rx[i],rx[i-1]),ly[i]=max(ly[i],ly[i-1]),ry[i]=min(ry[i],ry[i-1]);
	for(int i=1;i<=n;i++){
		T=n+n+i+i+1;mem(G,0);
		for(int j=1;j<=i;j++) add(0,n+n+j,1,0),add(n+n+i+j,T,1,0);
		for(int j=1;j<=i;j++){
			for(int k=1;k<=n;k++){
				if(lx[j]<x[k]&&x[k]<rx[i+1-j]) add(n+n+j,k,1,0);
				if(ly[j]<y[k]&&y[k]<ry[i+1-j]) add(n+k,n+n+i+j,1,0);
			}
		}
		for(int j=1;j<=n;j++) add(j,n+j,1,v[j]);
		ans=max(ans,MCMF());
	}
	printf("%lld",ans);
	return 0;
}
