import sys
from functools import lru_cache
from collections import defaultdict
sys.setrecursionlimit(10**9)
def I(): return input()
def IS(): return input().split()
def II(): return int(input())
def LI(): return list(input())
def MI(): return map(int,input().split())
def LMI(): return list(map(int,input().split()))
def LLMI(number): return [list(map(int,input().split())) for _ in range(number)]
def generate_input()->list:
import random
inputdata = []
n = random.randint(0, 100)
inputdata.append(n)
return inputdata
def simple_solve(n):
ans = 0
return ans
def solve(n, m, info):
posision = defaultdict(tuple)
posision[1] = (0, 0)
edge = defaultdict(list)
for a, b, x, y in info:
edge[a].append([b, x, y])
edge[b].append([a, -x, -y])
stack = [[1, 0, 0]]
while stack:
p, x, y = stack.pop()
for np, dx, dy in edge[p]:
if (x+dx, y+dy) == posision[np]:
continue
posision[np] = (x+dx, y+dy)
stack.append([np, x+dx, y+dy])
for i in range(n):
if len(posision[i+1]) != 2:
print("undecidable")
else:
print(*posision[i+1])
if __name__=='__main__':
test = False
if test:
inputdata = generate_input()
a = simple_solve(*inputdata)
b = solve(*inputdata)
if a != b:
print(*inputdata)
print(a, b)
exit(1)
else:
inputdata = []
for v in MI():
inputdata.append(v)
info = LLMI(inputdata[1])
inputdata.append(info)
solve(*inputdata)