//#define _GLIBCXX_DEBUG

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

#define endl '\n'
#define lfs cout<<fixed<<setprecision(10)
#define ALL(a)  (a).begin(),(a).end()
#define ALLR(a)  (a).rbegin(),(a).rend()
#define spa << " " <<
#define fi first
#define se second
#define MP make_pair
#define MT make_tuple
#define PB push_back
#define EB emplace_back
#define rep(i,n,m) for(ll i = (n); i < (ll)(m); i++)
#define rrep(i,n,m) for(ll i = (ll)(m) - 1; i >= (ll)(n); i--)
using ll = long long;
using ld = long double;
const ll MOD1 = 1e9+7;
const ll MOD9 = 998244353;
const int INF = 1e9;
using P = pair<ll, ll>;
template<typename T1, typename T2>
bool chmin(T1 &a,T2 b){if(a>b){a=b;return true;}else return false;}
template<typename T1, typename T2>
bool chmax(T1 &a,T2 b){if(a<b){a=b;return true;}else return false;}
ll median(ll a,ll b, ll c){return a+b+c-max({a,b,c})-min({a,b,c});}
void ans1(bool x){if(x) cout<<"Yes"<<endl;else cout<<"No"<<endl;}
void ans2(bool x){if(x) cout<<"YES"<<endl;else cout<<"NO"<<endl;}
void ans3(bool x){if(x) cout<<"Yay!"<<endl;else cout<<":("<<endl;}
template<typename T1,typename T2>
void ans(bool x,T1 y,T2 z){if(x)cout<<y<<endl;else cout<<z<<endl;}  
template<typename T>
void debug(vector<vector<T>>&v,ll h,ll w){for(ll i=0;i<h;i++)
{cout<<v[i][0];for(ll j=1;j<w;j++)cout spa v[i][j];cout<<endl;}};
void debug(vector<string>&v,ll h,ll w){for(ll i=0;i<h;i++)
{for(ll j=0;j<w;j++)cout<<v[i][j];cout<<endl;}};
template<typename T>
void debug(vector<T>&v,ll n){if(n!=0)cout<<v[0];
for(ll i=1;i<n;i++)cout spa v[i];cout<<endl;};
template<typename T>
vector<vector<T>>vec(ll x, ll y, T w){
  vector<vector<T>>v(x,vector<T>(y,w));return v;}
ll gcd(ll x,ll y){ll r;while(y!=0&&(r=x%y)!=0){x=y;y=r;}return y==0?x:y;}
vector<ll>dx={1,0,-1,0,1,1,-1,-1};
vector<ll>dy={0,1,0,-1,1,-1,1,-1};
template<typename T>
vector<T> make_v(size_t a,T b){return vector<T>(a,b);}
template<typename... Ts>
auto make_v(size_t a,Ts... ts){
  return vector<decltype(make_v(ts...))>(a,make_v(ts...));
}
template<typename T1, typename T2>
ostream &operator<<(ostream &os, const pair<T1, T2>&p){
  return os << p.first << " " << p.second;
}
//mt19937 mt(chrono::steady_clock::now().time_since_epoch().count());
struct z{
  ll x,y,d;
  z(ll a,ll b,ll c):x(a),y(b),d(c){};
};
vector<vector<ll>>dist(8005,vector<ll>(8005,INF));
void bfs(ll h,ll w,ll sx,ll sy,vector<vector<vector<bool>>>&t){
  rep(i,0,h)rep(j,0,w)dist[i][j]=INF;
  queue<struct z>que;
  que.emplace(sx,sy,0);
  while(!que.empty()){
    auto pos = que.front();
    que.pop();
    if(dist[pos.x][pos.y]!=INF)continue;
    dist[pos.x][pos.y]=pos.d;
    for(ll i=0;i<4;i++){
      if(!t[pos.x][pos.y][i])continue;
      ll x=pos.x+dx[i],y=pos.y+dy[i],d=pos.d+1;
      if(x<0||x>=h||y<0||y>=w)continue;
      que.emplace(x,y,d);
    }
  }
}
template<typename T>
map<T,ll> compress(vector<T> &v){
  sort(ALL(v));
  v.erase(unique(ALL(v)),v.end());
  map<T, ll> ret;
  for(ll i=0;i<(ll)v.size();i++)
    ret[v[i]]=i;
  return ret;
}
int main(){
  cin.tie(nullptr);
  ios_base::sync_with_stdio(false);
  ll res=0,buf=0;
  bool judge = true;
  ll n,m;cin>>n>>m;
  vector<ll>a(n),b(n),c(n);
  rep(i,0,n)cin>>a[i]>>b[i]>>c[i];
  vector<ll>d(m),e(m),f(m);
  rep(i,0,m)cin>>d[i]>>e[i]>>f[i];
  vector<ll>valx,valy;
  rep(i,0,n){
    valx.PB(a[i]);
    valx.PB(b[i]);
    valy.PB(c[i]);
  }
  rep(i,0,m){
    valx.PB(d[i]);
    valy.PB(e[i]);
    valy.PB(f[i]);
  }
  valx.PB(0);
  valy.PB(0);
  valx.PB(2e9);
  valy.PB(2e9);
  valx.PB(-2e9);
  valy.PB(-2e9);
  auto mpx=compress(valx);
  auto mpy=compress(valy);
  ll h=(ll)mpx.size()-1;
  ll w=(ll)mpy.size()-1;
  //vector<ll>dx={1,0,-1,0,1,1,-1,-1};
//vector<ll>dy={0,1,0,-1,1,-1,1,-1};
  auto t=make_v(h,w,4,true);
  rep(i,0,n){
    ll ux=mpx[a[i]],vx=mpx[b[i]],y=mpy[c[i]];
    rep(j,ux,vx){
      t[j][y][3]=false;
      t[j][y-1][1]=false;
    }
  }
  rep(i,0,n){
    ll x=mpx[d[i]],uy=mpy[e[i]],vy=mpy[f[i]];
    rep(j,uy,vy){
      t[x][j][2]=false;
      t[x-1][j][0]=false;
    }
  }
  bfs(h,w,mpx[0],mpy[0],t);
  rep(i,0,h)rep(j,0,w){
    if(dist[i][j]!=INF){
      if(i==0||i==h-1||j==0||j==w-1)judge=false;
      res+=(valx[i+1]-valx[i])*(valy[j+1]-valy[j]);
    }
  }
  ans(!judge,"INF",res);
  return 0;
}