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

typedef long long ll;
typedef long double ld;

const int inf = 1e9 + 7;

int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	int n, m;
	cin >> n >> m;
	vector<int> vx = {0, -inf, inf}, vy = {0, -inf, inf};
	vector<pair<pair<int, int>, int>> hor(n);
	for (auto& x : hor) {
		cin >> x.first.first >> x.first.second >> x.second;
		vx.push_back(x.first.first);
		vx.push_back(x.first.second);
		vy.push_back(x.second);
	}
	vector<pair<int, pair<int, int>>> ver(m);
	for (auto& x : ver) {
		cin >> x.first >> x.second.first >> x.second.second;
		vx.push_back(x.first);
		vy.push_back(x.second.first);
		vy.push_back(x.second.second);
	}
	auto compr = [&] (vector<int>& v) {
		sort(v.begin(), v.end());
		v.erase(unique(v.begin(), v.end()), v.end());
	};
	auto f = [&] (vector<int>& v, int& x) {
		x = lower_bound(v.begin(), v.end(), x) - v.begin();
	};
	compr(vx);
	compr(vy);
	for (auto& x : hor) {
		f(vx, x.first.first);
		f(vx, x.first.second);
		f(vy, x.second);
	}
	for (auto& x : ver) {
		f(vx, x.first);
		f(vy, x.second.first);
		f(vy, x.second.second);
	}
	vector<vector<bool>> kek(vx.size(), vector<bool>(vy.size(), false));
	vector<vector<bool>> lol(vx.size(), vector<bool>(vy.size(), false));
	for (auto x : hor) {
		for (int i = x.first.first; i < x.first.second; i++) kek[i][x.second] = true;
	}
	for (auto x : ver) {
		for (int i = x.second.first; i < x.second.second; i++) lol[x.first][i] = true;
	}
	vector<vector<bool>> used(vx.size(), vector<bool>(vy.size(), false));
	pair<int, int> st = {0, 0};
	f(vx, st.first);
	f(vy, st.second);
	auto ok = [&] (pair<int, int> p) {
		return p.first >= 0 && p.first + 1 < vx.size() && p.second >= 0 && p.second + 1 < vy.size() && !used[p.first][p.second];
	};
	vector<pair<int, int>> q = {st};
	used[st.first][st.second] = true;
	auto add = [&] (pair<int, int> p) {
		used[p.first][p.second] = true;
		q.push_back(p);
	};
	while (!q.empty()) {
		auto v = q.back();
		q.pop_back();
		if (ok({v.first - 1, v.second}) && !lol[v.first][v.second]) add({v.first - 1, v.second});
		if (ok({v.first + 1, v.second}) && !lol[v.first + 1][v.second]) add({v.first + 1, v.second});
		if (ok({v.first, v.second - 1}) && !kek[v.first][v.second]) add({v.first, v.second - 1});
		if (ok({v.first, v.second + 1}) && !kek[v.first][v.second + 1]) add({v.first, v.second + 1});
	}
	for (int i = 0; i + 1 < vx.size(); i++) {
		for (int j = 0; j + 1 < vy.size(); j++) {
			if (used[i][j] && (i == 0 || j == 0 || i + 2 == vx.size() || j + 2 == vy.size())) {
				cout << "INF\n";
				return 0;
			}
		}
	}
	ll ans = 0;
	for (int i = 0; i + 1 < vx.size(); i++) {
		for (int j = 0; j + 1 < vy.size(); j++) {
			if (used[i][j]) ans += (ll) (vx[i + 1] - vx[i]) * (vy[j + 1] - vy[j]);
		}
	}
	cout << ans;
	return 0;
}

