#include <bits/stdc++.h>
using namespace std;
inline int read() {
  int x = 0, f = 1;
  char ch = getchar();
  while (ch < '0' || ch > '9') {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') {
    x = x * 10 + ch - '0';
    ch = getchar();
  }
  return x * f;
}
long long dx[4] = {0, 0, -1, 1};
long long dy[4] = {1, -1, 0, 0};
int n, m, q;
char s[11];
long long bz[100010 << 1][52];
int pos[100010 << 1][52];
int head[100010 << 1], nex[100010 << 1], val[100010 << 1], op[100010 << 1], tot;
int T[100010 << 2];
void pushdown(int rt) {
  if (T[rt]) {
    T[rt << 1] = T[rt << 1 | 1] = T[rt];
    T[rt] = 0;
  }
}
void insert(int l, int r, int rt, int x, int y, int v) {
  if (x <= l && r <= y) {
    T[rt] = v;
    return;
  }
  int mid = l + r >> 1;
  pushdown(rt);
  if (mid >= x) insert(l, mid, rt << 1, x, y, v);
  if (mid < y) insert(mid + 1, r, rt << 1 | 1, x, y, v);
}
int query(int l, int r, int rt, int v) {
  if (l == r) return T[rt];
  int mid = l + r >> 1;
  pushdown(rt);
  if (mid >= v)
    return query(l, mid, rt << 1, v);
  else
    return query(mid + 1, r, rt << 1 | 1, v);
}
void add(long long x, long long y, int tp) {
  tot++;
  nex[tot] = head[x];
  head[x] = tot;
  val[tot] = y;
  op[tot] = tp;
}
struct vec {
  long long x1, x2, y1, y2;
  int op;
  void read() {
    scanf("%I64d%I64d%I64d%I64d", &x1, &y1, &x2, &y2);
    if (y1 < y2) op = 0;
    if (y1 > y2) op = 1;
    if (x1 > x2) op = 2;
    if (x1 < x2) op = 3;
  }
} a[100010];
struct node {
  int op;
  long long len, x, y;
  void read() {
    scanf("%I64d%I64d%s%I64d", &x, &y, s, &len);
    if (s[0] == 'U') op = 0;
    if (s[0] == 'D') op = 1;
    if (s[0] == 'L') op = 2;
    if (s[0] == 'R') op = 3;
  }
} b[100010];
pair<long long, long long> cal(long long x, long long y, int p) {
  if (a[p].x1 == a[p].x2) {
    if (a[p].x1 == x) {
      if (min(a[p].y1, a[p].y2) <= y && y <= max(a[p].y1, a[p].y2))
        return make_pair(x, y);
      if (y < min(a[p].y1, a[p].y2))
        return make_pair(x, min(a[p].y1, a[p].y2));
      else
        return make_pair(x, max(a[p].y1, a[p].y2));
    } else
      return make_pair(a[p].x1, y);
  } else {
    if (a[p].y1 == y) {
      if (min(a[p].x1, a[p].x2) <= x && x <= max(a[p].x1, a[p].x2))
        return make_pair(x, y);
      if (x < min(a[p].x1, a[p].x2))
        return make_pair(min(a[p].x1, a[p].x2), y);
      else
        return make_pair(max(a[p].x1, a[p].x2), y);
    } else
      return make_pair(x, a[p].y1);
  }
}
int dis(long long x1, long long y1, long long x2, long long y2) {
  return abs(x1 - x2) + abs(y1 - y2);
}
pair<long long, long long> find(long long x, long long y, int tp,
                                long long step) {
  return make_pair(x + step * dx[tp], y + step * dy[tp]);
}
void print(pair<long long, long long> p) {
  long long x = p.first, y = p.second;
  x = max(x, 0ll);
  x = min(x, (long long)m);
  y = max(y, 0ll);
  y = min(y, (long long)m);
  printf("%I64d %I64d\n", x, y);
}
int main() {
  n = read();
  m = read();
  for (int i = 1; i <= n; i++) a[i].read();
  q = read();
  for (int i = 1; i <= q; i++) b[i].read();
  for (int i = 0; i <= 3; i++) {
    tot = 0;
    memset(head, 0, sizeof(head));
    memset(T, 0, sizeof(T));
    for (int j = 1; j <= q; j++)
      if (b[j].op == i) {
        if (i < 2)
          add(b[j].y, j + n, 1);
        else
          add(b[j].x, j + n, 1);
      }
    for (int j = 1; j <= n; j++) {
      if (i == 0) add(max(a[j].y1, a[j].y2), j, 0);
      if (i == 1) add(min(a[j].y1, a[j].y2), j, 0);
      if (i == 2) add(min(a[j].x1, a[j].x2), j, 0);
      if (i == 3) add(max(a[j].x1, a[j].x2), j, 0);
    }
    for (int j = 1; j <= n; j++)
      if (a[j].op == i) {
        if (i < 2)
          add(a[j].y2, j, 1);
        else
          add(a[j].x2, j, 1);
      }
    int now = (i == 0 || i == 3) ? m : 0;
    while (now != -1 && now != m + 1) {
      for (int j = head[now]; j; j = nex[j]) {
        if (!op[j]) {
          if (i < 2)
            insert(0, m, 1, min(a[val[j]].x1, a[val[j]].x2),
                   max(a[val[j]].x1, a[val[j]].x2), val[j]);
          else
            insert(0, m, 1, min(a[val[j]].y1, a[val[j]].y2),
                   max(a[val[j]].y1, a[val[j]].y2), val[j]);
        } else {
          int tmp;
          if (val[j] <= n) {
            if (i < 2)
              tmp = query(0, m, 1, a[val[j]].x1);
            else
              tmp = query(0, m, 1, a[val[j]].y1);
          } else {
            if (i < 2)
              tmp = query(0, m, 1, b[val[j] - n].x);
            else
              tmp = query(0, m, 1, b[val[j] - n].y);
          }
          pos[val[j]][0] = tmp;
          if (tmp) {
            if (val[j] <= n)
              bz[val[j]][0] =
                  abs(a[tmp].x2 - a[val[j]].x2) + abs(a[tmp].y2 - a[val[j]].y2);
            else
              bz[val[j]][0] = abs(a[tmp].x2 - b[val[j] - n].x) +
                              abs(a[tmp].y2 - b[val[j] - n].y);
          } else
            bz[val[j]][0] = 1ll << 50;
        }
      }
      if (i == 0 || i == 3)
        now--;
      else
        now++;
    }
  }
  for (int i = 1; i <= 50; i++) bz[0][i] = 1ll << 50;
  for (int i = 1; i <= 50; i++)
    for (int j = 1; j <= n + q; j++) {
      pos[j][i] = pos[pos[j][i - 1]][i - 1];
      bz[j][i] = bz[j][i - 1] + bz[pos[j][i - 1]][i - 1];
      bz[j][i] = min(bz[j][i], 1ll << 50);
    }
  for (int i = 1; i <= q; i++) {
    int tmp = i + n;
    long long t = b[i].len;
    for (int j = 50; j >= 0; j--)
      if (bz[tmp][j] <= t) {
        t -= bz[tmp][j];
        tmp = pos[tmp][j];
      }
    if (tmp == i + n) {
      if (pos[tmp][0]) {
        pair<long long, long long> tq = cal(b[i].x, b[i].y, pos[tmp][0]);
        int tw = dis(tq.first, tq.second, b[i].x, b[i].y);
        if (tw >= t)
          print(find(b[i].x, b[i].y, b[i].op, t));
        else
          print(find(tq.first, tq.second, a[pos[tmp][0]].op, t - tw));
      } else
        print(find(b[i].x, b[i].y, b[i].op, t));
    } else {
      if (!pos[tmp][0])
        print(find(a[tmp].x2, a[tmp].y2, a[tmp].op, t));
      else {
        pair<long long, long long> tq = cal(a[tmp].x2, a[tmp].y2, pos[tmp][0]);
        int tw = dis(tq.first, tq.second, a[tmp].x2, a[tmp].y2);
        if (tw >= t)
          print(find(a[tmp].x2, a[tmp].y2, a[tmp].op, t));
        else
          print(find(tq.first, tq.second, a[pos[tmp][0]].op, t - tw));
      }
    }
  }
  return 0;
}
