// cities to vapori-
// corner cases // int vs ll // cin vs scanf // clear structures // statement // doublesz
#include <bits/stdc++.h>
#define pb push_back
#define fst first
#define snd second
#define sz(x) int(x.size())
#define fill(x,v) memset(x,v,sizeof(x))
#define REP(i,a,b) for(int i = int(a); i < int(b); ++i)
#define trace(x) cout << #x << " = " << x << endl
#define fastio ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0)
using namespace std;
typedef long long ll;
typedef pair<int,int> ii;

int get(vector<int> &all){
	auto it = upper_bound(all.begin(),all.end(),0);
	return it - all.begin() - 1;
}

int main(){

	fastio;
	int n,m;
	cin >> n >> m;
	vector< array<int,3> > ver(n), hor(m);
	vector<int> allx, ally;
	for(int i = 0; i < n; ++i){
		cin >> ver[i][0] >> ver[i][1] >> ver[i][2];
		allx.pb(ver[i][0]);
		allx.pb(ver[i][1]);
		ally.pb(ver[i][2]);
	}
	for(int i = 0; i < m; ++i){
		cin >> hor[i][0] >> hor[i][1] >> hor[i][2];
		allx.pb(hor[i][0]);
		ally.pb(hor[i][1]);
		ally.pb(hor[i][2]);
	}
	allx.pb(-2e9); allx.pb(2e9);
	ally.pb(-2e9); ally.pb(2e9);

	sort(allx.begin(),allx.end());
	allx.erase(unique(allx.begin(),allx.end()),allx.end());
	sort(ally.begin(),ally.end());
	ally.erase(unique(ally.begin(),ally.end()),ally.end());

	/*
	cout << "Allx" << endl;
	for(int i = 0; i < sz(allx); ++i){
		cout << allx[i] << " ";
	}
	cout << endl;
	cout << "Ally" << endl;
	for(int i = 0; i < sz(ally); ++i){
		cout << ally[i] << " ";
	}
	cout << endl;
	*/
	map<int,int> tox, toy;
	vector<int> revx(sz(allx)), revy(sz(ally));
	for(int i = 0; i < sz(allx); ++i){
		tox[allx[i]] = i;
		revx[i] = allx[i];
	}
	for(int i = 0; i < sz(ally); ++i){
		toy[ally[i]] = i;
		revy[i] = ally[i];
	}

	int len = max(sz(allx),sz(ally)) + 5;
	vector< vector<bool> > up(len, vector<bool>(len,true));
	vector< vector<bool> > dw(len, vector<bool>(len,true));
	vector< vector<bool> > lp(len, vector<bool>(len,true));
	vector< vector<bool> > rp(len, vector<bool>(len,true));

	for(int i = 0; i < n; ++i){
		int a = tox[ver[i][0]];
		int b = tox[ver[i][1]];
		int c = toy[ver[i][2]];
		for(int ii = a; ii < b; ++ii){
			lp[ii][c] = false;
			rp[ii][c-1] = false;
		}
	}

	for(int i = 0; i < m; ++i){
		int c = tox[hor[i][0]];
		int a = toy[hor[i][1]];
		int b = toy[hor[i][2]];
		for(int ii = a; ii < b; ++ii){
			dw[c-1][ii] = false;
			up[c][ii] = false;
		}
	}

	int px = get(allx);
	int py = get(ally);
	vector< vector<bool> > vist(len, vector<bool>(len,false));

	queue<ii> q;
	q.push(ii(px,py));
	vist[px][py] = true;

	auto valid = [&](int x, int y){
		return x >= 0 && x < len && y >= 0 && y < len && !vist[x][y];
	};

	while(sz(q)){
		ii par = q.front(); q.pop();
		int x = par.fst, y = par.snd;
		if(up[x][y]){
			int nx = x-1, ny = y;
			if(valid(nx,ny)){
				vist[nx][ny] = true;
				q.push(ii(nx,ny));
			}
		}
		if(dw[x][y]){
			int nx = x+1, ny = y;
			if(valid(nx,ny)){
				vist[nx][ny] = true;
				q.push(ii(nx,ny));
			}
		}
		if(lp[x][y]){
			int nx = x, ny = y-1;
			if(valid(nx,ny)){
				vist[nx][ny] = true;
				q.push(ii(nx,ny));
			}
		}
		if(rp[x][y]){
			int nx = x, ny = y+1;
			if(valid(nx,ny)){
				vist[nx][ny] = true;
				q.push(ii(nx,ny));
			}
		}
	}

	if(vist[0][0]){
		cout << "INF" << endl;
		exit(0);
	}

	ll ans = 0;
	for(int i = 0; i < len; ++i){
		for(int j = 0; j < len; ++j){
			if(vist[i][j]){
				ans += 1LL * (allx[i+1] - allx[i]) * (ally[j+1] - ally[j]);
			}
		}
	}

	cout << ans << endl;

	return 0;
}


Measured memory_bytes: 10220