#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 200005;
struct Node {
  int x, y, d;
};
inline bool operator==(const Node &a, const Node &b) {
  return a.x == b.x && a.y == b.y && a.d == b.d;
}
inline bool operator!=(const Node &a, const Node &b) { return !(a == b); }
int n, m, kk;
ll ans;
set<int> s1[N], s2[N];
set<pair<int, int>> st;
inline int ID(int x, int y, int d) { return d == 1 ? x - y + m + 1 : x + y; }
inline bool check(int x, int y) { return st.count({x, y}); }
inline void add(int x, int y) {
  s1[ID(x, y, 1)].insert(x);
  s2[ID(x, y, 2)].insert(x);
  st.insert({x, y});
}
pair<Node, int> dfs(Node pos) {
  Node ret;
  set<int>::iterator it;
  if (pos.d == 1) {
    it = prev(s1[ID(pos.x, pos.y, 1)].lower_bound(pos.x));
    ret.x = pos.x - (abs(*it - pos.x) - 1);
    ret.y = pos.y - (abs(*it - pos.x) - 1);
    if (check(ret.x - 1, ret.y) && check(ret.x, ret.y - 1))
      ret.d = 3;
    else if (check(ret.x - 1, ret.y))
      --ret.y, ret.d = 4;
    else if (check(ret.x, ret.y - 1))
      --ret.x, ret.d = 2;
    else
      ret.d = 3;
  } else if (pos.d == 2) {
    it = prev(s2[ID(pos.x, pos.y, 2)].lower_bound(pos.x));
    ret.x = pos.x - (abs(*it - pos.x) - 1);
    ret.y = pos.y + (abs(*it - pos.x) - 1);
    if (check(ret.x - 1, ret.y) && check(ret.x, ret.y + 1))
      ret.d = 4;
    else if (check(ret.x - 1, ret.y))
      ++ret.y, ret.d = 3;
    else if (check(ret.x, ret.y + 1))
      --ret.x, ret.d = 1;
    else
      ret.d = 4;
  } else if (pos.d == 3) {
    it = s1[ID(pos.x, pos.y, 1)].lower_bound(pos.x);
    ret.x = pos.x + (abs(*it - pos.x) - 1);
    ret.y = pos.y + (abs(*it - pos.x) - 1);
    if (check(ret.x + 1, ret.y) && check(ret.x, ret.y + 1))
      ret.d = 1;
    else if (check(ret.x + 1, ret.y))
      ++ret.y, ret.d = 2;
    else if (check(ret.x, ret.y + 1))
      ++ret.x, ret.d = 4;
    else
      ret.d = 1;
  } else {
    it = s2[ID(pos.x, pos.y, 2)].lower_bound(pos.x);
    ret.x = pos.x + (abs(*it - pos.x) - 1);
    ret.y = pos.y - (abs(*it - pos.x) - 1);
    if (check(ret.x + 1, ret.y) && check(ret.x, ret.y - 1))
      ret.d = 2;
    else if (check(ret.x + 1, ret.y))
      --ret.y, ret.d = 1;
    else if (check(ret.x, ret.y - 1))
      ++ret.x, ret.d = 3;
    else
      ret.d = 2;
  }
  return {ret, abs(*it - pos.x)};
}
bool judge(Node pos) {
  Node tmp = pos;
  do {
    auto cur = dfs(pos);
    ans += cur.second;
    switch (cur.first.d) {
      case 1:
        if (pos.d == 3)
          return 0;
        else
          break;
      case 2:
        if (pos.d == 4)
          return 0;
        else
          break;
      case 3:
        if (pos.d == 1)
          return 0;
        else
          break;
      case 4:
        if (pos.d == 2)
          return 0;
        else
          break;
    }
    pos = cur.first;
  } while (tmp != pos);
  return 1;
}
int main() {
  ios::sync_with_stdio(false);
  cin >> n >> m >> kk;
  for (int i = 0; i <= m + 1; i++) add(0, i), add(n + 1, i);
  for (int i = 1; i <= n; i++) add(i, 0), add(i, m + 1);
  int t1, t2;
  for (int i = 1; i <= kk; i++) cin >> t1 >> t2, add(t1, t2);
  char dir[5];
  int x, y, d;
  cin >> x >> y >> (dir + 1);
  if (dir[1] == 'N' && dir[2] == 'W')
    d = 1;
  else if (dir[1] == 'N' && dir[2] == 'E')
    d = 2;
  else if (dir[1] == 'S' && dir[2] == 'E')
    d = 3;
  else
    d = 4;
  auto tmp = dfs({x, y, d}).first;
  if (!judge(tmp)) {
    --ans;
    if (tmp.d % 2)
      tmp.d = 4 - tmp.d;
    else
      tmp.d = 6 - tmp.d;
    judge(tmp);
  }
  cout << ans << endl;
  return 0;
}
