#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#define MAXN 80
#define MAXM 320
#define MAXNODE 500
#define MAXEDGE MAXNODE*MAXNODE
#define INF 0x3FFFFFFF
#define INF2 1000000000000000000LL
using namespace std;
typedef long long LL;
typedef pair<int,LL> PII;
struct Point
{
	int x,y;
	LL V;
}poi[MAXN+5];
struct Limit
{
	int typ,a,b;
}lim[MAXM+5];
struct edge
{
	int to,cap;
	LL cost;
	edge *nxt,*bck;
}edges[MAXEDGE*2+5];
edge *ncnt,*Adj[MAXNODE+5],*Cur[MAXNODE+5];
int n,m;
int dn[MAXN+5],up[MAXN+5];
LL dist[MAXNODE+5];
bool vis[MAXNODE+5];
void Init()
{
	ncnt=&edges[0];
	memset(Adj,0,sizeof(Adj));
}
void AddEdge(int u,int v,int cap,LL cost)
{
	edge *p=++ncnt;
	p->to=v;p->cap=cap;p->cost=cost;
	p->nxt=Adj[u];Adj[u]=p;
	
	edge *q=++ncnt;
	q->to=u;q->cap=0;q->cost=-cost;
	q->nxt=Adj[v];Adj[v]=q;
	
	p->bck=q,q->bck=p;
}
bool SPFA(int S,int T,int nds)
{
	static queue<int> que;
	while(que.empty()==false)	que.pop();
	for(int i=S;i<=T;i++)
		vis[i]=false,dist[i]=-INF2;
	que.push(S);vis[S]=true;dist[S]=0;
	while(que.empty()==false)
	{
		int u=que.front();
		que.pop();vis[u]=false;
		for(edge *p=Adj[u];p!=NULL;p=p->nxt)
		{
			int v=p->to;
			if(p->cap&&dist[v]<dist[u]+p->cost)
			{
				dist[v]=dist[u]+p->cost;
				if(vis[v]==false)
					vis[v]=true,que.push(v);
			}
		}
	}
	if(dist[T]==-INF2)
		return false;
	return true;
}
int Aug(int T,int u,int tot,LL &ans)
{
	if(u==T)
		return tot;
	vis[u]=true;
	int sum=0,delta;
	for(edge *&p=Cur[u];p!=NULL;p=p->nxt)
	{
		int v=p->to;
		if(!vis[v]&&p->cap&&dist[u]+p->cost==dist[v])
		{
			delta=min(p->cap,tot-sum);
			delta=Aug(T,v,delta,ans);
			sum+=delta;
			p->cap-=delta,p->bck->cap+=delta;
			ans+=1LL*delta*p->cost;
			if(tot==sum)
				break;
		}
	}
	vis[u]=false;
	return sum;
}
PII Max_Cost_Flow(int S,int T,int nds)
{
	PII ret=PII(0,0);
	int tmn=0;
	while(SPFA(S,T,nds))
	{
		for(int i=S;i<=T;i++)
			Cur[i]=Adj[i],vis[i]=false;
		ret.first+=Aug(T,S,INF,ret.second);
		tmn++;
	}
	return ret;
}
void DeBug(int S,int T)
{
	printf("===========BEGIN============\n");
	for(int i=S;i<=T;i++)
	{
		printf("%d:",i);
		for(edge *p=Adj[i];p!=NULL;p=p->nxt)
			if(p->cap)
				printf("(%d %d %lld) ",p->to,p->cap,p->cost);
		printf("\n");
	}
	printf("============END=============\n");
}
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
		scanf("%d %d %lld",&poi[i].x,&poi[i].y,&poi[i].V);
	scanf("%d",&m);
	char opt[10];
	for(int i=1;i<=m;i++)
	{
		scanf("%s %d %d",opt,&lim[i].a,&lim[i].b);
		if(opt[0]=='L')	lim[i].typ=1;
		if(opt[0]=='R')	lim[i].typ=2;
		if(opt[0]=='D')	lim[i].typ=3;
		if(opt[0]=='U')	lim[i].typ=4;
	}
	LL ans=0;
	for(int tot=1;tot<=n;tot++)
	{
		Init();
		int nds=tot*2+200+2;
		int S=0,T=nds-1;
		for(int i=1;i<=tot;i++)
			AddEdge(S,i,1,0),AddEdge(i+tot+200,T,1,0);
		//对于x这一维建边 
		for(int i=1;i<=tot;i++)
			dn[i]=1,up[i]=100;
		for(int i=1;i<=m;i++)
			if(lim[i].typ==1&&lim[i].b+1<=tot)
				dn[lim[i].b+1]=max(dn[lim[i].b+1],lim[i].a+1);
			else if(lim[i].typ==2&&tot-lim[i].b>=1)
				up[tot-lim[i].b]=min(up[tot-lim[i].b],lim[i].a-1);
		for(int i=2;i<=tot;i++)
			dn[i]=max(dn[i-1],dn[i]);
		for(int i=tot-1;i>=1;i--)
			up[i]=min(up[i+1],up[i]);
		for(int i=1;i<=tot;i++)
			for(int j=dn[i];j<=up[i];j++)
				AddEdge(i,tot+j,MAXN,0);
		//对于y这一维建边
		for(int i=1;i<=tot;i++)
			dn[i]=1,up[i]=100;
		for(int i=1;i<=m;i++)
			if(lim[i].typ==3&&lim[i].b+1<=tot)
				dn[lim[i].b+1]=max(dn[lim[i].b+1],lim[i].a+1);
			else if(lim[i].typ==4&&tot-lim[i].b>=1)
				up[tot-lim[i].b]=min(up[tot-lim[i].b],lim[i].a-1);
		for(int i=2;i<=tot;i++)
			dn[i]=max(dn[i-1],dn[i]);
		for(int i=tot-1;i>=1;i--)
			up[i]=min(up[i+1],up[i]);
		for(int i=1;i<=tot;i++)
			for(int j=dn[i];j<=up[i];j++)
				AddEdge(j+100+tot,i+200+tot,MAXN,0);
		//对于每一个点建边
		for(int i=1;i<=n;i++)
			AddEdge(tot+poi[i].x,100+tot+poi[i].y,1,poi[i].V);
		PII ret=Max_Cost_Flow(S,T,nds);
		if(ret.first==tot)
			ans=max(ans,ret.second);
	}
	printf("%lld\n",ans);
	return 0;
}

Measured memory_bytes: 1024