#include<bits/stdc++.h>
using namespace std;
const int M = 5e5 + 10;
const double g = 9.8;
int n, m;
inline int read() {
int res = 0, p = 1;
char x = getchar();
while (x > '9' || x < '0') {
if (x == '-') p = -1;
x = getchar();
}
while (x <= '9' && x >= '0') {
res = (res << 1) + (res << 3) + x - '0';
x = getchar();
}
return res * p;
}
struct rpg{
int x, y, v, a, delt;
double drp;
bool operator<(const rpg &o) const{
if (y == o.y) return x < o.x;
return y < o.y;
}
};
rpg p[M], op[M];
long long ans[M], res;
bool cmp1(rpg x, rpg y) {
return x.drp < y.drp;
}
bool cmp(rpg x, rpg y) {
return x.delt > y.delt;
}
void lsh(int ll, int rr) {
sort(op + ll, op + rr + 1, cmp1);
int len = unique(op + ll, op + rr + 1) - op - ll;
for (int i = ll, i <= )
}
void deal(int ll, int rr) {
lsh(ll, rr);
for (int i = ll + 1;i <= rr;i ++) {
for (int j = ll;j < i;j ++) {
if (p[j].drp >= p[i].drp) {
ans[i] ++;
ans[j] ++;
res += 2;
}
}
}
}
int main(){
scanf("%d %d", &n, &m);
for (int i = 1;i <= n;i ++) {
p[i].x = read(); p[i].y = read(); p[i].v = read();
p[i].drp = p[i].x + 1.0 * p[i].v * sqrt(2.0 * p[i].y / g);
}
for (int i = 1;i <= n;i ++) {
p[i].a = read();
op[i] = p[i];
}
sort(p + 1, p + n + 1);
int ll = 1, tp = p[1].y;
for (int i = 1;i <= n + 1;i ++) {
if (p[i].y != tp || i == n + 1) {
deal(ll, i - 1);
ll = i;
tp = p[i].y;
}
}
for (int i = 1;i <= n;i ++) {
p[i].delt = min(0ll, ans[i] - p[i].a < 0 ? ans[i] : p[i].a);
}
sort(p + 1, p + n + 1, cmp);
for (int i = 1;i <= n;i ++) {
res -= p[i].delt;
}
printf("%lld", res);
return 0;
}