#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<b;i++)
using namespace std; void _main(); int main() { cin.tie(0); ios::sync_with_stdio(false); _main(); }
//---------------------------------------------------------------------------------------------------
template<int NV, class V> struct MinCostFlow {
struct edge { int to, cap, rev; V cost;
edge(int a, int b, V c, int d) { to = a; cap = b; cost = c; rev = d; } };
vector <edge> g[NV]; V h[NV], dist[NV]; int prevv[NV], preve[NV];
void add_edge(int from, int to, int cap, V cost) {
g[from].push_back(edge(to, cap, cost, g[to].size() ));
g[to].push_back(edge(from, 0, -cost, g[from].size() - 1 )); }
V mincost(int s, int t, int f) { V res = 0, i; for (i = 0; i < NV; i++) h[i] = 0;
while (f > 0) { int d = f; deque <pair<int, int> > q;
for (i = 0; i < NV; i++) dist[i] = 1e9; dist[s] = 0; q.push_back(make_pair(0, s));
while (!q.empty()) { int c = q.front().first; int v = q.front().second; q.pop_front();
if (dist[v] < c) continue; for (i = 0; i < g[v].size(); i++) { edge &e = g[v][i];
if (e.cap > 0 && dist[e.to] > dist[v] + e.cost + h[v] - h[e.to]) {
dist[e.to] = dist[v] + e.cost + h[v] - h[e.to]; prevv[e.to] = v; preve[e.to] = i;
if (dist[e.to] == dist[v] + 1) { q.push_back(make_pair(dist[e.to], e.to)); } else {
q.push_front(make_pair(dist[e.to], e.to)); } } } }
if (dist[t] == 1e9) return -1; for (i = 0; i < NV; i++) h[i] += dist[i];
for (i = t; i != s; i = prevv[i]) d = min(d, g[prevv[i]][preve[i]].cap); f -= d;
res += d * h[t]; for (i = t; i != s; i = prevv[i]) { edge &e = g[prevv[i]][preve[i]];
e.cap -= d; g[i][e.rev].cap += d; } } return res; } };
/*---------------------------------------------------------------------------------------------------
∧_∧
∧_∧ (´<_` ) Welcome to My Coding Space!
( ´_ゝ`) / ⌒i
/ \ | |
/ / ̄ ̄ ̄ ̄/ |
__(__ニつ/ _/ .| .|____
\/____/ (u ⊃
---------------------------------------------------------------------------------------------------*/
int N, M;
pair<int, int> A[50], B[50];
int D[50];
//---------------------------------------------------------------------------------------------------
void _main() {
cin >> N >> M;
rep(i, 0, N) {
string s; int x, y;
cin >> s >> x >> y;
A[i] = { x, y };
}
map<int, vector<int>> dic;
rep(i, 0, M) {
string s; int m, x, y;
cin >> s >> m >> x >> y;
B[i] = { x, y };
D[i] = m;
dic[m].push_back(i);
}
int K = min(N, M);
int cnt = 0;
MinCostFlow<110, int> mcf;
int s = N + M, t = N + M + 1, tt = N + M + 2;
for (auto ite = dic.rbegin(); ite != dic.rend(); ite++) {
int ma = ite->first;
auto v = ite->second;
if (cnt + v.size() < K) {
for (int i : v) mcf.add_edge(i + N, t, 1, 0);
cnt += v.size();
}
else if (cnt < K) {
for (int i : v) mcf.add_edge(i + N, tt, 1, 0);
mcf.add_edge(tt, t, K - cnt, 0);
cnt += v.size();
}
}
rep(i, 0, N) mcf.add_edge(s, i, 1, 0);
rep(i, 0, N) rep(j, 0, M) {
int d = abs(A[i].first - B[j].first) + abs(A[i].second - B[j].second);
if (D[j] == 0) d = 0;
mcf.add_edge(i, j + N, 1, d);
}
cout << mcf.mincost(s, t, K) << endl;
}