import math
import sys

def findNext(arr: list[int], x: int):
    low = 0
    top = len(arr) - 1
    while top > low:
        mid = math.ceil((top + low) / 2)
        if x > arr[mid]:
            low = mid + 1
        else:
            top = mid - 1
    if arr[low] == x:
        return low + 1
    return low

def advanceHunter(hunter, allGrovesAtX):
    indx = findNext(allGrovesAtX[hunter[0]], hunter[1])
    return (hunter[0], allGrovesAtX[hunter[0]][indx])

def checkIfGrooveInFront(hunter, maxGrooveYAtX) -> bool:
    if maxGrooveYAtX[hunter[0]] < hunter[1]:
        return False
    return True

def simulateForHunter(hunter, grooves, allGrovesAtX, maxGrooveYAtX):
    while checkIfGrooveInFront(hunter, maxGrooveYAtX):
        hunter = advanceHunter(hunter, allGrovesAtX)
        if hunter in grooves:
            hunter = grooves[hunter]
    return hunter[0]

def main():
    N_HUNTERS, N_GROOVES = map(int, input().split())
    grooves = {}
    allGrovesAtX = []
    for i in range(N_HUNTERS):
        allGrovesAtX.append([])
    maxGrooveYAtX = [0] * (N_HUNTERS)
    # Init
    for _ in range(N_GROOVES):
        x1, y1, x2, y2 = map(int, input().split())
        x1 = x1 - 1
        x2 = x2 - 1
        pos1 = (x1, y1)
        pos2 = (x2, y2)
        grooves[pos1] = pos2
        grooves[pos2] = pos1
        allGrovesAtX[x1].append(y1)
        allGrovesAtX[x2].append(y2)
        if maxGrooveYAtX[x1] < y1:
            maxGrooveYAtX[x1] = y1
        if maxGrooveYAtX[x2] < y2:
            maxGrooveYAtX[x2] = y2
    for g in allGrovesAtX:
        g.sort()
    hunters = [(i, 0) for i in range(N_HUNTERS)]
    finalPos = []
    # The juice
    for h in hunters:
        fp = simulateForHunter(h, grooves, allGrovesAtX, maxGrooveYAtX)
        finalPos.append(fp)
    for fpp in finalPos:
        print(fpp + 1)


if __name__ == "__main__":
    main()
