#include <bits/stdc++.h>
using namespace std;
const int MOD = 1000 * 1000 * 1000 + 7;
const int INF = 2000 * 1000 * 1000;
const double EPS = 1e-9;
const double pi = acos(-1.0);
template <typename T>
inline T sqr(T n) {
  return (n * n);
}
long long gcd(int a, int b) {
  while (a && b) {
    a %= b;
    swap(a, b);
  }
  return a + b;
}
struct Point {
  long long x, y;
  Point() {}
  Point(int x, int y) : x(x), y(y) {}
  Point(const Point& a) { *this = a; }
  Point operator-(const Point& a) const { return Point(x - a.x, y - a.y); }
  inline long long dist() { return sqr(x) + sqr(y); }
  bool operator<(const Point& p1) const {
    return (x < p1.x || (x == p1.x && y < p1.y));
  }
};
struct Line {
  long long a, b, c;
  Line() {}
  inline void normalize() {
    if (a < 0 || (a == 0 && b < 0)) {
      a *= -1;
      b *= -1;
      c *= -1;
    }
    long long g = gcd(gcd(abs(a), abs(b)), abs(c));
    if (g > 1) {
      a /= g;
      b /= g;
      c /= g;
    }
  }
  Line(int aa, int bb, int cc) {
    a = aa, b = bb, c = cc;
    normalize();
  }
  Line(const Point& p1, const Point& p2) {
    a = p2.y - p1.y;
    b = p1.x - p2.x;
    c = p1.y * p2.x - p1.x * p2.y;
    normalize();
  }
};
const int maxn = 300010;
vector<pair<Point, int> > v[maxn];
vector<int> vec[maxn];
map<long long, int> position;
vector<Point> tmp[maxn];
Point center[2000];
long long rad[2000];
long long get_hash(const Line& l) {
  long long a = l.a + 50000;
  long long b = l.b + 50000;
  long long c = l.c + 2000000000;
  long long ret = c * 2000000000LL;
  ret += a * 100000;
  ret += b;
  return ret;
}
void prepare(int pos) {
  vector<pair<Point, int> >& cur = v[pos];
  sort((cur).begin(), (cur).end());
  vec[pos].resize(cur.size());
  int cnt = 0;
  for (size_t i = 0; i < cur.size(); i++) {
    if (cur[i].second == 0)
      cnt++;
    else
      cnt--;
    vec[pos][i] = cnt;
  }
}
long long get_ans(const Point& p1, const Point& p2) {
  Line cur(p1, p2);
  Point mid((p1.x + p2.x) / 2, (p1.y + p2.y) / 2);
  Point norm(cur.a, cur.b);
  norm.x += mid.x;
  norm.y += mid.y;
  cur = Line(mid, norm);
  long long h = get_hash(cur);
  if (!position.count(h)) return 0;
  int pos = position[h];
  int q = upper_bound((v[pos]).begin(), (v[pos]).end(), make_pair(mid, 1)) -
          v[pos].begin() - 1;
  if (q != -1) return vec[pos][q];
  return 0;
}
int main() {
  int n, m;
  scanf("%d%d", &n, &m);
  Point p1, p2;
  int sz = 0;
  for (int i = 0; i < n; i++) {
    scanf("%I64d%I64d%I64d%I64d", &p1.x, &p1.y, &p2.x, &p2.y);
    p1.x *= 2, p1.y *= 2;
    p2.x *= 2, p2.y *= 2;
    Line cur(p1, p2);
    long long h = get_hash(cur);
    int pos = 0;
    if (position.count(h))
      pos = position[h];
    else {
      pos = sz++;
      position[h] = pos;
    }
    v[pos].push_back(make_pair(p1, (p1 < p2) ? 0 : 2));
    v[pos].push_back(make_pair(p2, (p1 < p2) ? 2 : 0));
  }
  for (int i = 0; i < sz; i++) prepare(i);
  long long ans = 0;
  for (int i = 0; i < m; i++) {
    scanf("%I64d%I64d%I64d", &center[i].x, &center[i].y, &rad[i]);
    center[i].x *= 2;
    center[i].y *= 2;
    rad[i] *= 2;
    for (size_t j = 0; j < tmp[rad[i]].size(); j++) {
      if ((center[i] - tmp[rad[i]][j]).dist() > 4 * sqr(rad[i]))
        ans += get_ans(center[i], tmp[rad[i]][j]);
    }
    tmp[rad[i]].push_back(center[i]);
  }
  printf("%I64d", ans);
  return 0;
}
