import sys
from collections import deque

# 全局蛇身队列(队头=蛇尾,队尾=蛇头)
snake = deque()

# 方向映射:1-上(0,1),2-下(0,-1),3-左(-1,0),4-右(1,0)
dir_map = {
    1: (0, 1),
    2: (0, -1),
    3: (-1, 0),
    4: (1, 0)
}

def moveSnake(dir):
    """移动逻辑:身体跟随前移,长度不变,碰撞检测新蛇身"""
    global snake  # 声明使用全局变量
    if not snake:
        return True
    
    # 计算新蛇头
    head_x, head_y = snake[-1]
    dx, dy = dir_map[dir]
    new_head = (head_x + dx, head_y + dy)
    
    # 模拟移动后的新蛇身(移除蛇尾,添加新蛇头)
    snake.popleft()
    snake.append(new_head)

    
    # 检测新蛇头是否与新身体(除头外)重叠
    body_parts = list(snake)[:-1]
    if new_head in body_parts:
        return True  # 碰撞,不执行移动
    
    # 无碰撞,更新全局蛇身
    return False

def eatSnake(dir):
    """生长逻辑:身体跟随前移+蛇尾保留,长度+1,碰撞检测新蛇身"""
    global snake  # 声明使用全局变量
    if not snake:
        return True
    
    # 计算新蛇头
    head_x, head_y = snake[-1]
    dx, dy = dir_map[dir]
    new_head = (head_x + dx, head_y + dy)
    
    # 模拟生长后的新蛇身(保留所有身体,添加新蛇头)
    snake.append(new_head)
    
    # 检测新蛇头是否与新身体(除头外)重叠
    body_parts = list(snake)[:-1]
    if new_head in body_parts:
        return True  # 碰撞,不执行生长
    
    # 无碰撞,更新全局蛇身
    return False

def main():
    global snake  # 声明使用全局变量
    data = sys.stdin.read().split()
    it = iter(data)
    n = int(next(it))
    q = int(next(it))
    
    # 初始化全局蛇身(清空原有内容)
    snake.clear()
    for _ in range(n):
        x = int(next(it))
        y = int(next(it))
        snake.append((x, y))
    
    # 处理每一步操作
    for _ in range(q):
        op = int(next(it))
        dir = int(next(it))
        
        collision = False
        if op == 1:
            collision = moveSnake(dir)
        elif op == 2:
            collision = eatSnake(dir)
        
        # 碰撞则输出-1并终止
        if collision:
            print(-1)
            return
        
        # 无碰撞,输出蛇头到蛇尾(反向遍历队列)
        for x, y in reversed(snake):
            print(f"{x} {y}")

if __name__ == '__main__':
    main()