#include <bits/stdc++.h>                                           
 
#define int long long
//#pragma GCC optimize("Ofast")
//#pragma comment(linker, "/stack:200000000")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4")
 
 
#define file(s) freopen(s".in","r",stdin); freopen(s".out","w",stdout);
#define forev(i, b, a) for(int i = (b); i >= (a); --i)
#define forn(i, a, b) for(int i = (a); i <= (b); ++i)
#define all(x) x.begin(), x.end()
#define sz(s) (int)s.size()
#define pb push_back
#define ppb pop_back
#define mp make_pair
#define s second
#define f first
 
 
using namespace std;
 
 
typedef pair < long long, long long > pll;    
typedef pair < int, int > pii;
typedef unsigned long long ull;         
typedef vector < pii > vpii;
typedef vector < int > vi;
typedef long double ldb;  
typedef long long ll;  
typedef double db;                             
 
 
const int dx[] = {1, -1, 0, 0}, dy[] = {0, 0, 1, -1}, block = 555;
const pii base = mp(1171, 3307), Mod = mp(1e9 + 7, 1e9 + 9);
const int inf = 1e9, maxn = 4e5 + 148, mod = 1e9 + 7, N = 2e3 + 11;
const db eps = 1e-12, pi = 3.14159265359;
const ll INF = 1e18;


int n, m, a[N], b[N], c[N], d[N], e[N], f[N], ans, x, y;
bool wasx[N][N], wasy[N][N], was[N][N];
queue < pii > q;
vi valx, valy;

int getx (int x) {
	return upper_bound(all(valx), x) - valx.begin();
}

int gety (int y) {
	return upper_bound(all(valy), y) - valy.begin();
}

main () {
	cin >> n >> m;	
	for (int i = 1; i <= n; ++i) {
		cin >> a[i] >> b[i] >> c[i];
		valx.pb(a[i]);
		valx.pb(b[i]);
		valy.pb(a[i]);
	}

	for (int i = 1; i <= m; ++i) {
		cin >> d[i] >> e[i] >> f[i];
		valx.pb(d[i]);
		valy.pb(e[i]);
		valy.pb(f[i]);
	}

	for (int i = -1; i <= 1; i += 2) {
		valx.pb(2*i*inf); 
		valy.pb(2*i*inf); 
	}

	sort(all(valx));
	valx.resize(unique(all(valx)) - valx.begin());

	sort(all(valy));
	valy.resize(unique(all(valy)) - valy.begin());

	for (int i = 1; i <= n; ++i) {
		y = gety(c[i]) - 1; 		
		int xl = getx(a[i]), xr = getx(b[i]);
		for (int x = xl; x < xr; ++x)
			wasx[x][y] = 1;
	}

	for (int i = 1; i <= m; ++i) {
		x = getx(d[i]) - 1;
		int yl = gety(e[i]), yr = gety(b[i]);
		for (int y = yl; y < yr; ++y)
			wasy[x][y] = 1;
	}

	x = getx(0);
	y = gety(0);

	q.push({x, y});
	was[x][y] = 1;
	
	while (sz(q)) {
		int x = q.front().f, y = q.front().s;
		ans += (valx[x] - valx[x - 1]) * (valy[y] - valy[y - 1]);
		q.pop();

		if (x == 1 || y == 1 || x == sz(valx) - 1 || y == sz(valy) - 1) {
			cout << "INF";
			return 0;
		}

		if (!was[x][y + 1] && !wasx[x][y]) {
			was[x][y + 1] = 1;
			q.push({x, y + 1});
		}

		if (!was[x][y - 1] && !wasx[x][y - 1]) {
			was[x][y - 1] = 1;
			q.push({x, y - 1});
		}

		if (!was[x + 1][y] && !wasy[x + 1][y]) {
			was[x + 1][y] = 1;
			q.push({x + 1, y});
		}

		if (!was[x - 1][y] && !wasy[x][y]) {
			was[x - 1][y] = 1;
			q.push({x - 1, y});			   
		}		
	}

	cout << ans << endl;
}
