#include <bits/stdc++.h>
#pragma GCC optimize(2)
using namespace std;
const int maxn = 3600 + 5;
const long long mod = 998244353;
long long inv[maxn], fac[maxn];
inline long long fpm(long long a, long long p) {
  long long res = 1;
  while (p) {
    if (p & 1) res = res * a % mod;
    a = a * a % mod;
    p /= 2;
  }
  return res;
}
void init() {
  inv[0] = fac[0] = 1;
  for (int i = 1; i < maxn; i++) {
    fac[i] = fac[i - 1] * i % mod;
    inv[i] = fpm(fac[i], mod - 2);
  }
}
inline long long geta(long long n, long long m) {
  if (n < m || n < 0 || m < 0) return 0;
  return fac[n] * inv[n - m] % mod;
}
long long f[maxn][maxn], g[maxn][maxn];
int vis[maxn][2];
int n, m, k;
int main() {
  cin >> n >> m >> k;
  for (int i = 1; i <= k; i++) {
    int x1, y1, x2, y2;
    scanf("%d%d%d%d", &x1, &y1, &x2, &y2);
    vis[x1][0] = vis[x2][0] = 1;
    vis[y1][1] = vis[y2][1] = 1;
  }
  init();
  int r = 0, c = 0;
  for (int i = 1; i <= n; i++) {
    if (vis[i][0] == 0) r++;
  }
  for (int i = 1; i <= m; i++) {
    if (vis[i][1] == 0) c++;
  }
  f[0][0] = 1;
  for (int i = 1; i <= n; i++) {
    for (int j = 0; j <= min(i / 2, r / 2); j++) {
      f[i][j] = f[i - 1][j];
      if (i >= 2 && j >= 1 && vis[i][0] == 0 && vis[i - 1][0] == 0) {
        f[i][j] = (f[i][j] + f[i - 2][j - 1]) % mod;
      }
    }
  }
  g[0][0] = 1;
  for (int i = 1; i <= m; i++) {
    for (int j = 0; j <= min(i / 2, c / 2); j++) {
      g[i][j] = g[i - 1][j];
      if (i >= 2 && j >= 1 && vis[i][1] == 0 && vis[i - 1][1] == 0) {
        g[i][j] = (g[i][j] + g[i - 2][j - 1]) % mod;
      }
    }
  }
  long long ans = 0;
  for (int i = 0; i <= n; i++) {
    for (int j = 0; j <= m; j++) {
      if (c - j * 2 >= i && r - i * 2 >= j)
        ans = (ans + f[n][i] * geta(c - j * 2, i) % mod * g[m][j] % mod *
                         geta(r - i * 2, j) % mod) %
              mod;
    }
  }
  cout << ans << endl;
}
