import sys
from collections import deque
def Golf():*a,=map(int,open(0))
def I():return int(input())
def S_():return input()
def IS():return input().split()
def LS():return [i for i in input().split()]
def LI():return [int(i) for i in input().split()]
def LI_():return [int(i)-1 for i in input().split()]
def NI(n):return [int(input()) for i in range(n)]
def NI_(n):return [int(input())-1 for i in range(n)]
def StoLI():return [ord(i)-97 for i in input()]
def ItoS(n):return chr(n+97)
def LtoS(ls):return ''.join([chr(i+97) for i in ls])
def GI(V,E,ls=None,Directed=False,index=1):
    org_inp=[];g=[[] for i in range(V)]
    FromStdin=True if ls==None else False
    for i in range(E):
        if FromStdin:
            inp=LI()
            org_inp.append(inp)
        else:
            inp=ls[i]
        if len(inp)==2:
            a,b=inp;c=1
        else:
            a,b,c=inp
        if index==1:a-=1;b-=1
        aa=(a,c);bb=(b,c);g[a].append(bb)
        if not Directed:g[b].append(aa)
    return g,org_inp
def GGI(h,w,search=None,replacement_of_found='.',mp_def={'#':1,'.':0},boundary=1):
#h,w,g,sg=GGI(h,w,search=['S','G'],replacement_of_found='.',mp_def={'#':1,'.':0},boundary=1) # sample usage
    mp=[boundary]*(w+2);found={}
    for i in range(h):
        s=input()
        for char in search:
            if char in s:
                found[char]=((i+1)*(w+2)+s.index(char)+1)
                mp_def[char]=mp_def[replacement_of_found]
        mp+=[boundary]+[mp_def[j] for j in s]+[boundary]
    mp+=[boundary]*(w+2)
    return h+2,w+2,mp,found
def TI(n):return GI(n,n-1)
def bit_combination(n,base=2):
    rt=[]
    for tb in range(base**n):s=[tb//(base**bt)%base for bt in range(n)];rt+=[s]
    return rt
def gcd(x,y):
    if y==0:return x
    if x%y==0:return y
    while x%y!=0:x,y=y,x%y
    return y
def show(*inp,end='\n'):
    if show_flg:print(*inp,end=end)
mo=10**9+7
FourNb=[(-1,0),(1,0),(0,1),(0,-1)];EightNb=[(-1,0),(1,0),(0,1),(0,-1),(1,1),(-1,-1),(1,-1),(-1,1)];compas=dict(zip('WENS',FourNb));cursol=dict(zip('LRUD',FourNb))
#sys.setrecursionlimit(10**7)
input=lambda: sys.stdin.readline().rstrip()

show_flg=False
show_flg=True
ans=0
inf=1<<70
n,m=LI()
X=[0,inf,-inf]
Y=[0,inf,-inf]
V=[]
H=[]
for i in range(n):
    a,b,c=LI()
    V.append(((a,b),c))
    Y.append(c)
    X.append(a)
    X.append(b)

n+=2
V.append(((-inf,inf),inf))
V.append(((-inf,inf),-inf))

for i in range(m):
    a,b,c=LI()
    H.append((a,(b,c)))
    X.append(a)
    Y.append(b)
    Y.append(c)

m+=2
H.append((inf,(-inf,inf)))
H.append((-inf,(-inf,inf)))


X.sort()
xdc={}
c=1
for j in sorted(set(X)):
    xdc[c]=j
    c+=1
nx=c-1

Y.sort()
ydc={}
c=1
for j in sorted(set(Y)):
    ydc[c]=j
    c+=1
ny=c-1

xdcr=dict(zip(xdc.values(),xdc.keys()))
ydcr=dict(zip(ydc.values(),ydc.keys()))

mp=[[0]*(2*nx+2) for i in range(2*ny+2)]
mpx=[[0]*(2*nx+2) for i in range(2*ny+2)]
#mpy=[[0]*(2*nx+2) for i in range(2*ny+2)]

for (a,b),c in V:
    mpx[ydcr[c]*2][xdcr[a]*2]+=1
    mpx[ydcr[c]*2][xdcr[b]*2+1]+=-1
for i in range(0,2*ny+2,2):
    for j in range(2*nx+1):
        mpx[i][j+1]+=mpx[i][j]
        
for d,(e,f) in H:
    mp[ydcr[e]*2][xdcr[d]*2]+=1
    mp[ydcr[f]*2+1][xdcr[d]*2]+=-1
for j in range(0,2*nx+2,2):
    for i in range(2*ny+1):
        mp[i+1][j]+=mp[i][j]

for i in range(0,2*ny+2,2):
    for j in range(2*nx+2):
        mp[i][j]|=mpx[i][j]

for i in mp:
    show(i)


v=[[0]*(2*nx+2) for i in range(2*ny+2)]
q=deque()
q.append((2*xdcr[0]+1,2*ydcr[0]+1))
v[2*ydcr[0]+1][2*xdcr[0]+1]=1
while q:
    cx,cy=q.popleft()
    px,py=cx>>1,cy>>1
    
    ans+=(xdc[px]-xdc[px+1])*(ydc[py]-ydc[py+1])
    #show((cx,cy),(xdc[px]-xdc[px-1])*(ydc[py]-ydc[py-1]),(xdc[px],xdc[px-1]),(ydc[py],ydc[py-1]))
    #show((cx,cy),px,py)
    for dx,dy in FourNb:
        nbx=cx+dx*2
        nby=cy+dy*2
        if (not 0<=nbx<2*nx+2) or (not 0<=nby<2*ny+2) or v[nby][nbx]==1:
            continue
        
        if mp[nby-dy][nbx-dx]==0:
            q.append((nbx,nby))
            v[nby][nbx]=1

if ans>=inf:
    ans='INF'
print(ans)

