#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
constexpr ll N = 2e5 + 5;
struct op {
char c;
ll a, b;
} op[N];
ll n, m, q, k, x, y;
char mp[505][505];
void move(char c, ll a) {
if (c == 'U') x = max(x - a, 1ll);
else if (c == 'D') x = min(x + a, n);
else if (c == 'L') y = max(y - a, 1ll);
else if (c == 'R') y = min(y + a, m);
}
char change(char c, ll n) {
if (c == 'U') return n & 1 ? 'D' : 'U';
else if (c == 'D') return n & 1 ? 'U' : 'D';
else if (c == 'L') return n & 1 ? 'R' : 'L';
else if (c == 'R') return n & 1 ? 'L' : 'R';
}
ll tree[N][21];
ll lowbit(ll x) { return (-x) & x; }
void add(ll id, ll i, ll x) {
while (i <= N) {
tree[id][i] += x;
i += lowbit(i);
}
}
ll query(ll id, ll i) {
ll s = 0;
while (i > 0) {
s += tree[id][i];
i -= lowbit(i);
}
return s;
}
void add_K(ll l, ll b, ll x) {
ll id = (l % k ? l % k : k);
ll s = (l - id) / k + 1;
add(id, s, x);
add(id, s + b, -x);
}
ll get(ll i) {
ll id = (i % k ? i % k : k);
ll s = (i - id) / k + 1;
return query(id, s);
}
int main(void) {
cin >> n >> m >> q >> k;
for (ll i = 1; i <= n; i++)
for (ll j = 1; j <= m; j++) cin >> mp[i][j];
for (ll i = 1; i <= q; i++) cin >> op[i].c >> op[i].a >> op[i].b;
x = 1, y = 1;
for (ll i = 1; i <= q; i++) {
move(change(op[i].c, get(i)), op[i].a);
if (mp[x][y] == 'X' && op[i].b > 0)
add_K(i + k, op[i].b, 1);
}
cout << x << ' ' << y;
return 0;
}