#include <bits/stdc++.h>
using i64 = long long;
using u64 = unsigned long long;
using u32 = unsigned;
using u128 = unsigned __int128;
int dx[] = {0, -1, 1, 0, 0};
int dy[] = {0, 0, 0, -1, 1};
struct Pt {
int pos;
int val;
};
int main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
int N, M, x, y, K;
std::cin >> N >> M >> x >> y >> K;
std::vector<std::vector<char>> f(N + 1, std::vector<char>(M + 1));
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= M; j++) {
std::cin >> f[i][j];
}
}
std::vector dp(N + 1, std::vector<int>(M + 1, std::numeric_limits<int>::min()));
dp[x][y] = 0;
int ans = 0;
auto dfs = [&](int x, int y, int l, int d, int L) -> void {
std::deque<Pt> mx;
for (int i = 1; i <= L; i++) {
x += dx[d];
y += dy[d];
if (x < 1 || x > N || y < 1 || y > M || f[x][y] == 'x') {
mx.clear();
} else {
while (!mx.empty() && dp[x][y] >= (mx.back().val + i - mx.back().pos)) {
mx.pop_back();
}
mx.push_back({i, dp[x][y]});
while (!mx.empty() && mx.front().pos < i - l) {
mx.pop_front();
}
dp[x][y] = mx.front().val + i - mx.front().pos;
ans = std::max(ans, dp[x][y]);
}
}
};
for (int i = 1; i <= K; i++) {
int s, t, d;
std::cin >> s >> t >> d;
int l = t - s + 1;
if (d == 1) {
for (int i = 1; i <= M; i++) {
dfs(N, i, l, d, N);
}
} else if (d == 2) {
for (int i = 1; i <= M; i++) {
dfs(1, i, l, d, N);
}
} else if (d == 3) {
for (int i = 1; i <= N; i++) {
dfs(i, M, l, d, M);
}
} else if (d == 4) {
for (int i = 1; i <= N; i++) {
dfs(i, 1, l, d, M);
}
}
}
std::cout << ans << "\n";
return 0;
}