#include <bits/stdc++.h>
using namespace std;
inline void read(int &x) {
  int v = 0, f = 1;
  char c = getchar();
  while (!isdigit(c) && c != '-') c = getchar();
  if (c == '-')
    f = -1;
  else
    v = (c & 15);
  while (isdigit(c = getchar())) v = (v << 1) + (v << 3) + (c & 15);
  x = v * f;
}
inline void read(long long &x) {
  long long v = 0ll, f = 1ll;
  char c = getchar();
  while (!isdigit(c) && c != '-') c = getchar();
  if (c == '-')
    f = -1;
  else
    v = (c & 15);
  while (isdigit(c = getchar())) v = (v << 1) + (v << 3) + (c & 15);
  x = v * f;
}
inline void readc(char &x) {
  char c;
  while (((c = getchar()) == ' ') || c == '\n')
    ;
  x = c;
}
inline void writes(string s) { puts(s.c_str()); }
inline void writeln() { writes(""); }
inline void writei(int x) {
  if (x < 0) {
    putchar('-');
    x = abs(x);
  }
  if (!x) putchar('0');
  char a[25];
  int top = 0;
  while (x) {
    a[++top] = (x % 10) + '0';
    x /= 10;
  }
  while (top) {
    putchar(a[top]);
    top--;
  }
}
inline void writell(long long x) {
  if (x < 0) {
    putchar('-');
    x = abs(x);
  }
  if (!x) putchar('0');
  char a[25];
  int top = 0;
  while (x) {
    a[++top] = (x % 10) + '0';
    x /= 10;
  }
  while (top) {
    putchar(a[top]);
    top--;
  }
}
int n, m, k, i, j, f[3605][1805], g[3605][1805], c1[3605], c2[3605], s1, s2, x,
    y, mod = 998244353, fac[3605], inv[3605], first[3605], ans;
int p(int x, int y) {
  if (x < y) return 0;
  return 1ll * fac[x] * first[x - y] % mod;
}
int main() {
  fac[0] = fac[1] = inv[0] = inv[1] = first[0] = first[1] = 1;
  for ((i) = (2); (i) <= (3600); (i)++) {
    fac[i] = 1ll * fac[i - 1] * i % mod;
    inv[i] = 1ll * (mod - mod / i) * inv[mod % i] % mod;
    first[i] = 1ll * first[i - 1] * inv[i] % mod;
  }
  read(n);
  read(m);
  read(k);
  for (((i)) = (1); ((i)) <= ((k)); ((i))++) {
    read(x);
    read(y);
    int lx = x, ly = y;
    if (++c1[x] > 1) {
      puts("0");
      return 0;
    }
    if (++c2[y] > 1) {
      puts("0");
      return 0;
    }
    read(x);
    read(y);
    if (lx != x && ++c1[x] > 1) {
      puts("0");
      return 0;
    }
    if (ly != y && ++c2[y] > 1) {
      puts("0");
      return 0;
    }
  }
  c1[0] = c2[0] = 1;
  f[0][0] = 1;
  for (((i)) = (1); ((i)) <= ((n)); ((i))++) {
    if (c1[i] == 0) s1++;
    for ((j) = (0); (j) <= (i / 2); (j)++) {
      f[i][j] = f[i - 1][j];
      if (c1[i] == 0 && c1[i - 1] == 0) {
        (f[i][j] += f[i - 2][j - 1]) %= mod;
      }
    }
  }
  g[0][0] = 1;
  for (((i)) = (1); ((i)) <= ((m)); ((i))++) {
    if (c2[i] == 0) s2++;
    for ((j) = (0); (j) <= (i / 2); (j)++) {
      g[i][j] = g[i - 1][j];
      if (c2[i] == 0 && c2[i - 1] == 0) {
        (g[i][j] += g[i - 2][j - 1]) %= mod;
      }
    }
  }
  for ((i) = (0); (i) <= (n / 2); (i)++)
    for ((j) = (0); (j) <= (m / 2); (j)++) {
      ans = (ans + 1ll * f[n][i] * g[m][j] % mod * p(s2 - 2 * j, i) % mod *
                       p(s1 - 2 * i, j)) %
            mod;
    }
  cout << ans << endl;
  return 0;
}
