#include <stdio.h>
#include <stdlib.h>

int main() {
    int n;
    scanf("%d", &n);

    // 动态分配棋盘内存
    int **board = (int **)malloc(n * sizeof(int *));
    for (int i = 0; i < n; i++) {
        board[i] = (int *)malloc(n * sizeof(int));
    }

    // 读取棋盘数据
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            scanf("%d", &board[i][j]);
        }
    }

    int q;
    scanf("%d", &q);

    // 动态分配查询内存
    int **ask = (int **)malloc(q * sizeof(int *));
    for (int i = 0; i < q; i++) {
        ask[i] = (int *)malloc(4 * sizeof(int));
    }

    // 读取查询
    for (int i = 0; i < q; i++) {
        for (int j = 0; j < 4; j++) {
            scanf("%d", &ask[i][j]);
        }
    }

    // 处理每个查询
    for (int i = 0; i < q; i++) {
        // 将1-based坐标转换为0-based
        int x1 = ask[i][0] - 1;
        int y1 = ask[i][1] - 1;
        int x2 = ask[i][2] - 1;
        int y2 = ask[i][3] - 1;

        int x = x1;
        int y = y1;

        while (1) {
            int cell = board[x][y]; // 获取当前位置的值

            if (cell == 0) {
                // 向下移动:检查下一步是否超出下边界
                if (x + 1 <= x2) {
                    x++; // 仍在子矩阵内,移动
                } else {
                    // 下一步超出边界,输出当前位置(1-based)
                    printf("%d %d\n", x + 1, y + 1);
                    break;
                }
            } else if (cell == 1) {
                // 向右移动:检查下一步是否超出右边界
                if (y + 1 <= y2) {
                    y++; // 仍在子矩阵内,移动
                } else {
                    // 下一步超出边界,输出当前位置(1-based)
                    printf("%d %d\n", x + 1, y + 1);
                    break;
                }
            }
        }
    }

    // 释放内存
    for (int i = 0; i < n; i++) {
        free(board[i]);
    }
    free(board);

    for (int i = 0; i < q; i++) {
        free(ask[i]);
    }
    free(ask);

    return 0;
}