import java.util.*;

/**
 * @author supermejane
 * @date 2025/10/1
 * @description 牛客noob130 贪吃蛇游戏
 */
public class Main {
    static Deque<int[]> snake = new ArrayDeque<>();
	
  	//存储四个方向
    private static HashMap<Integer, List<Integer>> direct = new HashMap<>();
	//记录当前贪吃蛇占的位置
    private static HashSet<String> pos = new HashSet<>();
	//输入snack初始化pos
	static {
		  direct.put(1, Arrays.asList(0, 1));
		  direct.put(2, Arrays.asList(0, -1));
		  direct.put(3, Arrays.asList(-1, 0));
		  direct.put(4, Arrays.asList(1, 0));
	}
    private static void initpos(Deque<int[]> snack) {
        Iterator<int[]> iterator = snack.iterator();
        while (iterator.hasNext()) {
            int[] e = iterator.next();
            pos.add(array2Str(e));
        }
    }

    private static String array2Str(int[] e) {
        return String.valueOf(e[0]) + "-" + String.valueOf(e[1]);
    }
  
    public static boolean moveSnake(int dir) {
        int[] newHead = new int[2];
        newHead[0] = snake.getFirst()[0] + direct.get(dir).get(0);
        newHead[1] = snake.getFirst()[1] + direct.get(dir).get(1);
        int[] oldTail = snake.getLast();

        if (isCollapse(snake, newHead, oldTail)) {
            return true;
        }

        snake.addFirst(newHead);
        pos.remove(array2Str(snake.getLast()));
        snake.pollLast();
	  	//最后加入是一定不会出错的,放在前面的话可能会被pos.remove删除
        pos.add(array2Str(newHead));

        return false;
    }
	
  	//检查是否发生碰撞,exclude是为了排除移动之前的Tail
    public static boolean isCollapse(Deque<int[]> snake, int[] newHead, int[] exclude) {
        if (snake.size() <= 1) return false;
        String newHeadStr = array2Str(newHead);
        String excludeStr = exclude != null ? array2Str(exclude) : null;
        if (pos.contains(newHeadStr) && !newHeadStr.equals(excludeStr)) {
            return true;
        }
        return false;
    }

    public static boolean eatSnake(int dir) {
        int[] newHead = new int[2];
        newHead[0] = snake.getFirst()[0] + direct.get(dir).get(0);
        newHead[1] = snake.getFirst()[1] + direct.get(dir).get(1);

        if (isCollapse(snake, newHead, null)) {
            return true;
        }

        snake.addFirst(newHead);
        pos.add(array2Str(newHead));

        return false;
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int q = sc.nextInt();
        snake.clear();
        for (int i = 0; i < n; i++) {
            int x = sc.nextInt();
            int y = sc.nextInt();
            snake.addFirst(new int[] {x, y}); //这里把题目自带的addLast改成addFirst
        }
	  	//
        initpos(snake);
        for (int i = 0; i < q; i++) {
            int op = sc.nextInt();
            int dir = sc.nextInt();
            boolean collision = (op == 1 ? moveSnake(dir) : eatSnake(dir));
            if (collision) {
                System.out.println(-1);
                sc.close();
                return;
            } else {
			  	//改成从头开始遍历
                Iterator<int[]> it = snake.iterator();
                while (it.hasNext()) {
                    int[] p = it.next();
                    System.out.println(p[0] + " " + p[1]);
                }
            }
        }
        sc.close();
    }
}