#include "bits/stdc++.h"
using namespace std;

struct X {
	long long A, B, C;
};
struct Y {
	long long D, E, F;
};

long long INF = 1000000000;

int dx[4] = { 1, 0, -1, 0 }, dy[4] = { 0, 1, 0, -1 };

int main() {
	int N, M;
	cin >> N >> M;
	vector<X> VX(N);
	vector<Y> VY(M);
	vector<long long> H, W;
	for (int i = 0; i < N; i++) {
		cin >> VX[i].A >> VX[i].B >> VX[i].C;
		H.push_back(VX[i].A);
		H.push_back(VX[i].B);
		W.push_back(VX[i].C);
	}
	for (int i = 0; i < M; i++) {
		cin >> VY[i].D >> VY[i].E >> VY[i].F;
		swap(VY[i].D, VY[i].E);
		swap(VY[i].E, VY[i].F);
		W.push_back(VY[i].D);
		W.push_back(VY[i].E);
		H.push_back(VY[i].F);
	}
	H.push_back(INF + 1), H.push_back(-INF - 1);
	W.push_back(INF + 1), W.push_back(-INF - 1);
	sort(H.begin(), H.end());
	sort(W.begin(), W.end());
	H.erase(unique(H.begin(), H.end()), H.end());
	W.erase(unique(W.begin(), W.end()), W.end());
	for (int i = 0; i < N; i++) {
		VX[i].A = lower_bound(H.begin(), H.end(), VX[i].A) - H.begin();
		VX[i].B = lower_bound(H.begin(), H.end(), VX[i].B) - H.begin();
		VX[i].C = lower_bound(W.begin(), W.end(), VX[i].C) - W.begin();
	}
	for (int i = 0; i < M; i++) {
		VY[i].D = lower_bound(W.begin(), W.end(), VY[i].D) - W.begin();
		VY[i].E = lower_bound(W.begin(), W.end(), VY[i].E) - W.begin();
		VY[i].F = lower_bound(H.begin(), H.end(), VY[i].F) - H.begin();
	}
	vector<vector<vector<bool> > > V(H.size() - 1, vector<vector<bool> >(W.size() - 1, vector<bool>(4, true)));
	vector<vector<bool> > B(H.size() - 1, vector<bool>(W.size() - 1, false));
	for (int i = 0; i < N; i++) {
		for (int j = VX[i].A; j < VX[i].B; j++) {
			V[j][VX[i].C - 1][1] = V[j][VX[i].C][3] = false;
		}
	}
	for (int i = 0; i < M; i++) {
		for (int j = VY[i].D; j < VY[i].E; j++) {
			V[VY[i].F - 1][j][0] = V[VY[i].F][j][2] = false;
		}
	}
	/*
	for (int i = 0; i < H.size() - 1; i++) {
		for (int j = 0; j < W.size() - 1; j++) {
			cout << ' ' << (V[i][j][2] ? '.' : '#');
		}
		cout << endl;
		for (int j = 0; j < W.size() - 1; j++) {
			cout << (V[i][j][3] ? '.' : '#') << ' ';
		}
		cout << (V[i][W.size() - 2][1] ? '.' : '#') << endl;
	}
	*/
	for (int i = 0; i < H.size() - 1; i++) {
		V[i][0][3] = V[i][W.size() - 2][1] = false;
	}
	for (int i = 0; i < W.size() - 1; i++) {
		V[0][i][2] = V[H.size() - 2][i][0] = false;
	}
	int SX, SY;
	for (int i = 0; i < H.size() - 1; i++) {
		if (H[i] <= 0 && 0 < H[i + 1]) SX = i;
	}
	for (int i = 0; i < W.size() - 1; i++) {
		if (W[i] <= 0 && 0 < W[i + 1]) SY = i;
	}
	B[SX][SY] = true;
	queue<pair<int, int> > Q;
	Q.push({ SX, SY });
	while (!Q.empty()) {
		pair<int, int> PP = Q.front();
		Q.pop();
		for (int i = 0; i < 4; i++) {
			if (V[PP.first][PP.second][i]) {
				int NX = PP.first + dx[i], NY = PP.second + dy[i];
				if (!B[NX][NY]) {
					B[NX][NY] = true;
					Q.push({ NX, NY });
				}
			}
		}
	}
	if (B[0][0]) {
		cout << "INF" << endl;
		return 0;
	}
	long long COUNT = 0;
	for (int i = 0; i < H.size() - 1; i++) {
		for (int j = 0; j < W.size() - 1; j++) {
			if (B[i][j]) COUNT += (H[i + 1] - H[i]) * (W[j + 1] - W[j]);
		}
	}
	cout << COUNT << endl;
}