#include<cstdio> #include<climits> #include<cmath> #include<algorithm> constint MAXN = 505; constdouble EPS = 1e-10; intdcmp(double x){ if (fabs(x) <= EPS) return0; if (x > EPS) return1; return-1; } structPoint { double x, y; Point(double x = 0, double y = 0) : x(x), y(y) {} friend Point operator-(const Point &a, const Point &b) { return Point(a.x - b.x, a.y - b.y); } frienddoublecross(const Point &a, const Point &b){ return a.x * b.y - a.y * b.x; } frienddoubledot(const Point &a, const Point &b){ return a.x * b.x + a.y * b.y; } } a[MAXN], b[MAXN]; int m, n; int dist[MAXN][MAXN]; voidcalcDist(){ for (int i = 1; i <= m; i++) for (int j = 1; j <= m; j++) dist[i][j] = INT_MAX; for (int i = 1; i <= m; i++) for (int j = 1; j <= m; j++) if (i != j) { bool flag = true; for (int k = 1; k <= n; k++) { int t = dcmp(cross(a[j] - a[i], b[k] - a[i])); if (t < 0 || (t == 0 && dcmp(dot(a[j] - a[i], b[k] - a[i])) < 0)) { flag = false; break; } } if (flag) dist[i][j] = 1; } } voidfloyd(){ for (int k = 1; k <= m; k++) for (int i = 1; i <= m; i++) if (dist[i][k] < INT_MAX) { for (int j = 1; j <= m; j++) if (dist[k][j] < INT_MAX) dist[i][j] = std::min(dist[i][j], dist[i][k] + dist[k][j]); } } boolisSame(){ for (int i = 2; i <= m; i++) if (dcmp(a[i].x - a[1].x) || dcmp(a[i].y - a[1].y)) returnfalse; for (int i = 1; i <= n; i++) if (dcmp(b[i].x - a[1].x) || dcmp(b[i].y - a[1].y)) returnfalse; returntrue; } intmain(){ scanf("%d %d", &m, &n); for (int i = 1; i <= m; i++) scanf("%lf %lf %*lf", &a[i].x, &a[i].y); for (int i = 1; i <= n; i++) scanf("%lf %lf %*lf", &b[i].x, &b[i].y); if (isSame()) returnputs("1"), 0; calcDist(); floyd(); int ans = INT_MAX; for (int i = 1; i <= m; i++) ans = std::min(ans, dist[i][i]); if (ans == INT_MAX) puts("-1"); elseprintf("%d\n", ans); return0; }