#include <bits/stdc++.h>
using namespace std;
inline void Fail() {
  printf("0");
  exit(0);
}
const int maxn = 100005;
const int offset = 100000;
int n, m, k, sx, sy;
set<int> s[2][maxn * 2];
map<pair<int, int>, bool> block;
char c[maxn];
long long ans;
bool back;
class status {
 public:
  int nx, ny, dx, dy;
  status() {}
  status(int _nx, int _ny, int _dx, int _dy) {
    nx = _nx;
    ny = _ny;
    dx = _dx;
    dy = _dy;
  }
  bool operator<(const status &other) const {
    if (nx != other.nx) return nx < other.nx;
    if (ny != other.ny) return ny < other.ny;
    if (dx != other.dx) return dx < other.dx;
    return dy < other.dy;
  }
};
map<status, bool> vis;
status go(status cur) {
  int tx, ty, px, py;
  if (cur.dx + cur.dy == 0) {
    set<int>::iterator it = s[0][cur.nx + cur.ny].lower_bound(cur.ny);
    ty = (*it) - 1;
    if (cur.dy == -1) it--, ty = (*it) + 1;
    if (ty < 1) ty = 1;
    if (ty > m) ty = m;
    tx = cur.nx + cur.ny - ty;
  } else {
    set<int>::iterator it = s[1][cur.nx - cur.ny + offset].lower_bound(cur.ny);
    ty = (*it) - 1;
    if (cur.dy == -1) it--, ty = (*it) + 1;
    if (ty < 1) ty = 1;
    if (ty > m) ty = m;
    tx = cur.nx - cur.ny + ty;
  }
  ans += abs(ty - cur.ny) + 1;
  if (block[make_pair(tx, ty + cur.dy)] && !block[make_pair(tx + cur.dx, ty)])
    px = cur.dx, py = -cur.dy, tx += px;
  else if (!block[make_pair(tx, ty + cur.dy)] &&
           block[make_pair(tx + cur.dx, ty)])
    px = -cur.dx, py = cur.dy, ty += py;
  else
    px = -cur.dx, py = -cur.dy;
  return status(tx, ty, px, py);
}
void doit(status cur) {
  for (;;) {
    status cur2 = go(cur);
    if (cur.dx == -cur2.dx && cur.dy == -cur2.dy) {
      back = true;
      return;
    }
    if (vis[cur2]) return;
    vis[cur2] = true;
    cur = cur2;
  }
}
int main() {
  scanf("%d%d%d", &n, &m, &k);
  for (int(i) = 0; (i) < k; i++) {
    int x, y;
    scanf("%d%d", &x, &y);
    s[0][x + y].insert(y);
    s[1][x - y + offset].insert(y);
    block[make_pair(x, y)] = true;
  }
  for (int(i) = 0; (i) < m + 2; i++) {
    s[0][i].insert(i);
    s[1][-i + offset].insert(i);
    block[make_pair(0, i)] = true;
    s[0][i + n + 1].insert(i);
    s[1][n + 1 - i + offset].insert(i);
    block[make_pair(n + 1, i)] = true;
  }
  for (int(i) = 1; (i) <= n; i++) {
    s[0][i].insert(0);
    s[1][i + offset].insert(0);
    block[make_pair(i, 0)] = true;
    s[0][i + m + 1].insert(m + 1);
    s[1][i - m - 1 + offset].insert(m + 1);
    block[make_pair(i, m + 1)] = true;
  }
  scanf("%d%d%s", &sx, &sy, c);
  string dir = c;
  status beg(sx, sy, -1, -1);
  if (dir == "NE") beg.dx = -1, beg.dy = 1;
  if (dir == "NW") beg.dx = -1, beg.dy = -1;
  if (dir == "SE") beg.dx = 1, beg.dy = 1;
  if (dir == "SW") beg.dx = 1, beg.dy = -1;
  beg = go(beg);
  vis[beg] = true;
  ans = 0;
  status cur = beg;
  doit(cur);
  if (back) {
    cur = beg;
    cur.dx = -cur.dx;
    cur.dy = -cur.dy;
    doit(cur);
    ans--;
  }
  printf("%I64d", ans);
  return 0;
}
