#include <bits/stdc++.h>
using namespace std;
template <class T>
void debug(T itr1, T itr2) {
  auto now = itr1;
  while (now < itr2) {
    cout << *now << " ";
    now++;
  }
  cout << endl;
}
const long long MOD = pow(10, 9) + 7;
const long long LLINF = pow(2, 61) - 1;
const int INF = pow(2, 30) - 1;
vector<long long> fac;
void c_fac(int x = pow(10, 6) + 10) {
  fac.resize(x, true);
  for (int i = (int)0; i < (int)x; i++) fac[i] = i ? (fac[i - 1] * i) % MOD : 1;
}
long long inv(long long a, long long m = MOD) {
  long long b = m, x = 1, y = 0;
  while (b != 0) {
    int d = a / b;
    a -= b * d;
    swap(a, b);
    x -= y * d;
    swap(x, y);
  }
  return (x + m) % m;
}
long long nck(long long n, long long k) {
  return fac[n] * inv(fac[k] * fac[n - k] % MOD) % MOD;
}
long long gcd(long long a, long long b) {
  if (a < b) swap(a, b);
  return b == 0 ? a : gcd(b, a % b);
}
long long lcm(long long a, long long b) { return a / gcd(a, b) * b; }
struct query {
  long long A, B, C;
};
vector<vector<vector<bool>>> adj;
vector<vector<bool>> used;
void dfs(int x, int y) {
  if (used[x][y]) return;
  used[x][y] = true;
  if (adj[x][y][0]) dfs(x - 1, y);
  if (adj[x][y][1]) dfs(x, y - 1);
  if (adj[x][y][2]) dfs(x + 1, y);
  if (adj[x][y][3]) dfs(x, y + 1);
}
int main() {
  int N, M;
  cin >> N >> M;
  vector<query> qx, qy;
  set<long long> setx, sety;
  for (int i = (int)0; i < (int)N; i++) {
    long long A, B, C;
    cin >> A >> B >> C;
    if (A > B) swap(A, B);
    qx.push_back({A, B, C});
    sety.insert(A);
    sety.insert(B);
    setx.insert(C);
  }
  for (int i = (int)0; i < (int)M; i++) {
    long long A, B, C;
    cin >> A >> B >> C;
    if (B > C) swap(B, C);
    qy.push_back({B, C, A});
    sety.insert(A);
    setx.insert(B);
    setx.insert(C);
  }
  vector<long long> vx, vy;
  for (auto x : setx) vx.push_back(x);
  for (auto x : sety) vy.push_back(x);
  long long sx = vx.size() + 1, sy = vy.size() + 1;
  adj.resize(sx);
  for (int i = (int)0; i < (int)sx; i++) {
    adj[i].resize(sy);
    for (int j = (int)0; j < (int)sy; j++) adj[i][j].resize(4, true);
  }
  used.resize(sx);
  for (int i = (int)0; i < (int)sx; i++) used[i].resize(sy, false);
  for (int i = (int)0; i < (int)sx; i++)
    for (int j = (int)0; j < (int)sy; j++) {
      if (i == 0) adj[i][j][0] = false;
      if (i == sx - 1) adj[i][j][2] = false;
      if (j == 0) adj[i][j][1] = false;
      if (j == sy - 1) adj[i][j][3] = false;
    }
  for (int i = (int)0; i < (int)N; i++) {
    int pa = lower_bound(vy.begin(), vy.end(), qx[i].A) - vy.begin();
    int pb = lower_bound(vy.begin(), vy.end(), qx[i].B) - vy.begin();
    int pc = lower_bound(vx.begin(), vx.end(), qx[i].C) - vx.begin();
    for (int j = (int)pa + 1; j < (int)pb + 1; j++) {
      adj[j][pc][3] = false;
      adj[j][pc + 1][1] = false;
    }
  }
  for (int i = (int)0; i < (int)M; i++) {
    int pa = lower_bound(vx.begin(), vx.end(), qy[i].A) - vx.begin();
    int pb = lower_bound(vx.begin(), vx.end(), qy[i].B) - vx.begin();
    int pc = lower_bound(vy.begin(), vy.end(), qy[i].C) - vy.begin();
    for (int j = (int)pa + 1; j < (int)pb + 1; j++) {
      adj[pc][j][2] = false;
      adj[pc + 1][j][0] = false;
    }
  }
  int spx = upper_bound(vx.begin(), vx.end(), 0) - vx.begin();
  int spy = upper_bound(vy.begin(), vy.end(), 0) - vy.begin();
  dfs(spx, spy);
  long long result = 0;
  for (int i = (int)0; i < (int)sx; i++)
    for (int j = (int)0; j < (int)sy; j++) {
      if (used[i][j]) {
        if (i == 0 || i == sx - 1 || j == 0 || j == sy - 1) {
          cout << "INF" << endl;
          return 0;
        } else
          result += (vx[i] - vx[i - 1]) * (vy[i] - vy[i - 1]);
      }
    }
  cout << result << endl;
  return 0;
}
