#include<bits/stdc++.h>
using namespace std;
const double eps=1e-8;
const int inf=1e9;
const int N=110, M=1e4+10;
string ss; map<string, int> mp;
int n, k, s, t, ans, dep[N], pre[N];
struct node{int x, y;} p[N]; int v[N][N]; bool st[N];
struct edge{int x, y, c, f, pre;} a[M]; int alen, last[N], le[M];
void ins(int x, int y, int c) {
a[++alen]={x, y, 1, c, last[x]}; last[x]=alen;
a[++alen]={y, x, 0, -c, last[y]}; last[y]=alen;
}
void change() {for(int i=0;i<ss.length();i++) if(ss[i]>='A'&&ss[i]<='Z') ss[i]+=32;}
double dist(int x, int y, int xx, int yy) {return sqrt((x-xx)*(x-xx)+(y-yy)*(y-yy));}
bool check(int x, int y) {
double xy=dist(p[x].x, p[x].y, p[y].x, p[y].y);
if(xy>k) return false;
for(int i=1;i<=2*n;i++) {
if(i==x||i==y) continue;
double xx=dist(p[x].x, p[x].y, p[i].x, p[i].y);
double yy=dist(p[i].x, p[i].y, p[y].x, p[y].y);
if(xx+yy-xy<eps) return false;
}
return true;
}
bool bfs() {
memset(st, 0, sizeof(st));
for(int i=0;i<=2*n+1;i++) dep[i]=-inf;
queue<int> q; q.push(s);
dep[s]=0; st[s]=1;
while(!q.empty()) {
int x=q.front(); q.pop(); st[x]=0;
for(int k=last[x];k;k=a[k].pre) {
int y=a[k].y;
if(a[k].c&&dep[y]<dep[x]+a[k].f) {
dep[y]=dep[x]+a[k].f;
pre[y]=x; le[y]=k;
if(!st[y]) {st[y]=true; q.push(y);}
}
}
}
if(dep[t]==-inf) return 0;
for(int i=t;i!=s;i=pre[i]) a[le[i]].c--, a[le[i]^1].c++;
ans+=dep[t];
return true;
}
int main() {
alen=1; memset(last, 0, sizeof(last));
scanf("%d%d", &k, &n);
s=0, t=2*n+1;
for(int i=1;i<=n;i++) ins(s, i, 0), ins(i+n, t, 0);
memset(v, 0, sizeof(v));
for(int i=1;i<=n;i++) {
int x, y; scanf("%d%d", &x, &y);
cin >> ss; change();
mp[ss]=i; p[i]={x, y};
}
for(int i=n+1;i<=n*2;i++) {
int x, y; scanf("%d%d", &x, &y);
cin >> ss; change();
mp[ss]=i; p[i]={x, y};
}
while(1) {
cin >> ss; change();
if(ss[0]=='e'&&ss[1]=='n'&&ss[2]=='d') break;
int x=mp[ss]; cin >> ss; change();
int y=mp[ss], c; scanf("%d", &c);
v[x][y]=v[y][x]=c;
}
for(int i=1;i<=n;i++)
for(int j=n+1;j<=2*n;j++)
if(check(i, j))
ins(i, j, v[i][j]==0?1:v[i][j]);
ans=0;
while(bfs()) ;
printf("%d\n", ans);
return 0;
}