def f_single_dot():

    # https://atcoder.jp/contests/abc168/submissions/13368489

    import sys

    from collections import deque

    input = sys.stdin.readline

    N, M = [int(i) for i in input().split()]



    X, Y = set([0]), set([0])

    A, B, C = [0] * N, [0] * N, [0] * N

    for i in range(N):

        A[i], B[i], C[i] = list(map(int, input().split()))

        X.add(A[i])

        X.add(B[i])

        Y.add(C[i])

    D, E, F = [0] * M, [0] * M, [0] * M

    for i in range(M):

        D[i], E[i], F[i] = list(map(int, input().split()))

        X.add(D[i])

        Y.add(E[i])

        Y.add(F[i])

    UX = list(X)

    UY = list(Y)

    UX.sort()

    UY.sort()

    dictx, dicty = {n: i * 2 for i, n in enumerate(UX)}, {n: i * 2 for i, n in enumerate(UY)}

    LX = [UX[i // 2 + 1] - UX[i // 2] if i % 2 else 0 for i in range(len(UX) * 2 - 1)]

    LY = [UY[i // 2 + 1] - UY[i // 2] if i % 2 else 0 for i in range(len(UY) * 2 - 1)]

    c = [[0] * (len(UX) * 2 - 1) for _ in range(len(UY) * 2 - 1)]

    for i in range(N):

        y = dicty[C[i]]

        for x in range(dictx[A[i]], dictx[B[i]] + 1):

            c[y][x] = 1

    for i in range(M):

        x = dictx[D[i]]

        for y in range(dicty[E[i]], dicty[F[i]] + 1):

            c[y][x] = 1

    que = deque()

    used = [[0] * len(UX) * 2 for _ in range(len(UY) * 2)]

    dy = [1, 1, -1, -1]

    dx = [1, -1, 1, -1]

    for k in range(4):

        nny, nnx = dicty[0] + dy[k], dictx[0] + dx[k]

        if 1 <= nny < len(UY) * 2 - 1 and 1 <= nnx < len(UX) * 2 - 1:

            que.append((nny, nnx))

            used[nny][nnx] = 1

    ans = 0

    dy = [1, 0, -1, 0]

    dx = [0, 1, 0, -1]

    while que:

        y, x = que.popleft()

        if y % 2 and x % 2:

            ans += LY[y] * LX[x]

        for k in range(4):

            ny, nx = y + dy[k], x + dx[k]

            nny, nnx = ny + dy[k], nx + dx[k]

            if c[ny][nx] == 0:

                if nny < 0 or nny >= len(UY) * 2 - 1 or nnx < 0 or nnx >= len(UX) * 2 - 1:

                    return 'INF'

                if not used[nny][nnx]:

                    que.append((nny, nnx))

                    used[nny][nnx] = 1

    return ans



print((f_single_dot()))
def f_single_dot():

    # https://atcoder.jp/contests/abc168/submissions/13368489

    import sys

    from collections import deque

    input = sys.stdin.readline

    N, M = [int(i) for i in input().split()]



    X, Y = set([0]), set([0])

    A, B, C = [0] * N, [0] * N, [0] * N

    for i in range(N):

        A[i], B[i], C[i] = list(map(int, input().split()))

        X |= {A[i], B[i]}

        Y |= {C[i]}

    D, E, F = [0] * M, [0] * M, [0] * M

    for i in range(M):

        D[i], E[i], F[i] = list(map(int, input().split()))

        X |= {D[i]}

        Y |= {E[i], F[i]}

    X = sorted(X)

    Y = sorted(Y)

    dictx, dicty = {n: i * 2 for i, n in enumerate(X)}, {n: i * 2 for i, n in enumerate(Y)}

    LX = [X[i // 2 + 1] - X[i // 2] if i % 2 else 0 for i in range(len(X) * 2 - 1)]

    LY = [Y[i // 2 + 1] - Y[i // 2] if i % 2 else 0 for i in range(len(Y) * 2 - 1)]

    c = [[0] * (len(X) * 2 - 1) for _ in range(len(Y) * 2 - 1)]

    for i in range(N):

        y = dicty[C[i]]

        for x in range(dictx[A[i]], dictx[B[i]] + 1):

            c[y][x] = 1

    for i in range(M):

        x = dictx[D[i]]

        for y in range(dicty[E[i]], dicty[F[i]] + 1):

            c[y][x] = 1

    que = deque()

    used = [[0] * len(X) * 2 for _ in range(len(Y) * 2)]

    dy = [1, 1, -1, -1]

    dx = [1, -1, 1, -1]

    for k in range(4):

        nny, nnx = dicty[0] + dy[k], dictx[0] + dx[k]

        if 1 <= nny < len(Y) * 2 - 1 and 1 <= nnx < len(X) * 2 - 1:

            que.append((nny, nnx))

            used[nny][nnx] = 1

    ans = 0

    dy = [1, 0, -1, 0]

    dx = [0, 1, 0, -1]

    while que:

        y, x = que.popleft()

        if y % 2 and x % 2:

            ans += LY[y] * LX[x]

        for k in range(4):

            ny, nx = y + dy[k], x + dx[k]

            nny, nnx = ny + dy[k], nx + dx[k]

            if c[ny][nx] == 0:

                if nny < 0 or nny >= len(Y) * 2 - 1 or nnx < 0 or nnx >= len(X) * 2 - 1:

                    return 'INF'

                if not used[nny][nnx]:

                    que.append((nny, nnx))

                    used[nny][nnx] = 1

    return ans



print((f_single_dot()))
def f_single_dot():
    # https://atcoder.jp/contests/abc168/submissions/13368489
    import sys
    from collections import deque

    input = sys.stdin.readline
    N, M = [int(i) for i in input().split()]
    X, Y = set([0]), set([0])
    A, B, C = [0] * N, [0] * N, [0] * N
    for i in range(N):
        A[i], B[i], C[i] = list(map(int, input().split()))
        X.add(A[i])
        X.add(B[i])
        Y.add(C[i])
    D, E, F = [0] * M, [0] * M, [0] * M
    for i in range(M):
        D[i], E[i], F[i] = list(map(int, input().split()))
        X.add(D[i])
        Y.add(E[i])
        Y.add(F[i])
    UX = list(X)
    UY = list(Y)
    UX.sort()
    UY.sort()
    dictx, dicty = {n: i * 2 for i, n in enumerate(UX)}, {
        n: i * 2 for i, n in enumerate(UY)
    }
    LX = [UX[i // 2 + 1] - UX[i // 2] if i % 2 else 0 for i in range(len(UX) * 2 - 1)]
    LY = [UY[i // 2 + 1] - UY[i // 2] if i % 2 else 0 for i in range(len(UY) * 2 - 1)]
    c = [[0] * (len(UX) * 2 - 1) for _ in range(len(UY) * 2 - 1)]
    for i in range(N):
        y = dicty[C[i]]
        for x in range(dictx[A[i]], dictx[B[i]] + 1):
            c[y][x] = 1
    for i in range(M):
        x = dictx[D[i]]
        for y in range(dicty[E[i]], dicty[F[i]] + 1):
            c[y][x] = 1
    que = deque()
    used = [[0] * len(UX) * 2 for _ in range(len(UY) * 2)]
    dy = [1, 1, -1, -1]
    dx = [1, -1, 1, -1]
    for k in range(4):
        nny, nnx = dicty[0] + dy[k], dictx[0] + dx[k]
        if 1 <= nny < len(UY) * 2 - 1 and 1 <= nnx < len(UX) * 2 - 1:
            que.append((nny, nnx))
            used[nny][nnx] = 1
    ans = 0
    dy = [1, 0, -1, 0]
    dx = [0, 1, 0, -1]
    while que:
        y, x = que.popleft()
        if y % 2 and x % 2:
            ans += LY[y] * LX[x]
        for k in range(4):
            ny, nx = y + dy[k], x + dx[k]
            nny, nnx = ny + dy[k], nx + dx[k]
            if c[ny][nx] == 0:
                if (
                    nny < 0
                    or nny >= len(UY) * 2 - 1
                    or nnx < 0
                    or nnx >= len(UX) * 2 - 1
                ):
                    return "INF"
                if not used[nny][nnx]:
                    que.append((nny, nnx))
                    used[nny][nnx] = 1
    return ans


print((f_single_dot()))

def f_single_dot():
    # https://atcoder.jp/contests/abc168/submissions/13368489
    import sys
    from collections import deque

    input = sys.stdin.readline
    N, M = [int(i) for i in input().split()]
    X, Y = set([0]), set([0])
    A, B, C = [0] * N, [0] * N, [0] * N
    for i in range(N):
        A[i], B[i], C[i] = list(map(int, input().split()))
        X |= {A[i], B[i]}
        Y |= {C[i]}
    D, E, F = [0] * M, [0] * M, [0] * M
    for i in range(M):
        D[i], E[i], F[i] = list(map(int, input().split()))
        X |= {D[i]}
        Y |= {E[i], F[i]}
    X = sorted(X)
    Y = sorted(Y)
    dictx, dicty = {n: i * 2 for i, n in enumerate(X)}, {
        n: i * 2 for i, n in enumerate(Y)
    }
    LX = [X[i // 2 + 1] - X[i // 2] if i % 2 else 0 for i in range(len(X) * 2 - 1)]
    LY = [Y[i // 2 + 1] - Y[i // 2] if i % 2 else 0 for i in range(len(Y) * 2 - 1)]
    c = [[0] * (len(X) * 2 - 1) for _ in range(len(Y) * 2 - 1)]
    for i in range(N):
        y = dicty[C[i]]
        for x in range(dictx[A[i]], dictx[B[i]] + 1):
            c[y][x] = 1
    for i in range(M):
        x = dictx[D[i]]
        for y in range(dicty[E[i]], dicty[F[i]] + 1):
            c[y][x] = 1
    que = deque()
    used = [[0] * len(X) * 2 for _ in range(len(Y) * 2)]
    dy = [1, 1, -1, -1]
    dx = [1, -1, 1, -1]
    for k in range(4):
        nny, nnx = dicty[0] + dy[k], dictx[0] + dx[k]
        if 1 <= nny < len(Y) * 2 - 1 and 1 <= nnx < len(X) * 2 - 1:
            que.append((nny, nnx))
            used[nny][nnx] = 1
    ans = 0
    dy = [1, 0, -1, 0]
    dx = [0, 1, 0, -1]
    while que:
        y, x = que.popleft()
        if y % 2 and x % 2:
            ans += LY[y] * LX[x]
        for k in range(4):
            ny, nx = y + dy[k], x + dx[k]
            nny, nnx = ny + dy[k], nx + dx[k]
            if c[ny][nx] == 0:
                if nny < 0 or nny >= len(Y) * 2 - 1 or nnx < 0 or nnx >= len(X) * 2 - 1:
                    return "INF"
                if not used[nny][nnx]:
                    que.append((nny, nnx))
                    used[nny][nnx] = 1
    return ans


print((f_single_dot()))

-        X.add(A[i]) -        X.add(B[i]) -        Y.add(C[i]) +        X |= {A[i], B[i]} +        Y |= {C[i]} -        X.add(D[i]) -        Y.add(E[i]) -        Y.add(F[i]) -    UX = list(X) -    UY = list(Y) -    UX.sort() -    UY.sort() -    dictx, dicty = {n: i * 2 for i, n in enumerate(UX)}, { -        n: i * 2 for i, n in enumerate(UY) +        X |= {D[i]} +        Y |= {E[i], F[i]} +    X = sorted(X) +    Y = sorted(Y) +    dictx, dicty = {n: i * 2 for i, n in enumerate(X)}, { +        n: i * 2 for i, n in enumerate(Y) -    LX = [UX[i // 2 + 1] - UX[i // 2] if i % 2 else 0 for i in range(len(UX) * 2 - 1)] -    LY = [UY[i // 2 + 1] - UY[i // 2] if i % 2 else 0 for i in range(len(UY) * 2 - 1)] -    c = [[0] * (len(UX) * 2 - 1) for _ in range(len(UY) * 2 - 1)] +    LX = [X[i // 2 + 1] - X[i // 2] if i % 2 else 0 for i in range(len(X) * 2 - 1)] +    LY = [Y[i // 2 + 1] - Y[i // 2] if i % 2 else 0 for i in range(len(Y) * 2 - 1)] +    c = [[0] * (len(X) * 2 - 1) for _ in range(len(Y) * 2 - 1)] -    used = [[0] * len(UX) * 2 for _ in range(len(UY) * 2)] +    used = [[0] * len(X) * 2 for _ in range(len(Y) * 2)] -        if 1 <= nny < len(UY) * 2 - 1 and 1 <= nnx < len(UX) * 2 - 1: +        if 1 <= nny < len(Y) * 2 - 1 and 1 <= nnx < len(X) * 2 - 1: -                if ( -                    nny < 0 -                    or nny >= len(UY) * 2 - 1 -                    or nnx < 0 -                    or nnx >= len(UX) * 2 - 1 -                ): +                if nny < 0 or nny >= len(Y) * 2 - 1 or nnx < 0 or nnx >= len(X) * 2 - 1: