#include <bits/stdc++.h>
using namespace std;
const int inf = 2e9;
const long long Inf = 1e10;
const int P = 1e9 + 7;
const int N = 100005;
const int M = 1000005;
inline long long IN() {
  long long x = 0;
  int ch = 0, f = 0;
  for (ch = getchar(); ch != -1 && (ch < 48 || ch > 57); ch = getchar())
    f = (ch == '-');
  for (; ch >= 48 && ch <= 57; ch = getchar())
    x = (x << 1) + (x << 3) + ch - '0';
  return f ? (-x) : x;
}
template <typename T>
inline int chkmin(T &a, const T &b) {
  if (b < a) return a = b, 1;
  return 0;
}
template <typename T>
inline int chkmax(T &a, const T &b) {
  if (b > a) return a = b, 1;
  return 0;
}
void renew(int &x, const int &y) {
  x += y;
  if (x >= P) x -= P;
  if (x < 0) x += P;
}
int Pow(int x, int y, int p) {
  int a = 1;
  for (; y; y >>= 1, x = (long long)x * x % p)
    if (y & 1) a = (long long)a * x % p;
  return a;
}
vector<pair<int, int> > in[M], ou[M];
int n, m, K;
int cov[M << 2], sum[M << 2], len[M << 2];
int ql, qr, qv, qans;
void Cov(int x, int y) {
  cov[x] = y;
  sum[x] = 1LL * len[x] * y % P;
}
void sep(int x) {
  if (cov[x] == -1) return;
  Cov(x << 1, cov[x]);
  Cov(x + x + 1, cov[x]);
  cov[x] = -1;
}
void A(int x, int L, int R) {
  if (ql <= L && R <= qr) {
    Cov(x, qv);
    return;
  }
  sep(x);
  int md = (L + R) >> 1;
  if (ql <= md) A(x << 1, L, md);
  if (md < qr) A(x + x + 1, md + 1, R);
  sum[x] = sum[x + x + 1];
  renew(sum[x], sum[x << 1]);
}
void Add(int l, int r, int v) {
  if (l > r) return;
  ql = l;
  qr = r;
  qv = v;
  A(1, 1, m);
}
void Q(int x, int L, int R) {
  if (ql <= L && R <= qr) {
    renew(qans, sum[x]);
    return;
  }
  sep(x);
  int md = (L + R) >> 1;
  if (ql <= md) Q(x << 1, L, md);
  if (md < qr) Q(x + x + 1, md + 1, R);
}
int Ask(int l, int r) {
  if (l > r) return 0;
  ql = l;
  qr = r;
  qans = 0;
  Q(1, 1, m);
  return qans;
}
void B(int x, int L, int R) {
  len[x] = R - L + 1;
  if (L == R) return;
  int md = (L + R) / 2;
  B(x << 1, L, md);
  B(x + x + 1, md + 1, R);
}
set<pair<int, int> > st;
int main() {
  scanf("%d%d%d", &n, &m, &K);
  for (int i = (int)(1); i <= (int)(K); i++) {
    int x1, y1, x2, y2;
    scanf("%d%d%d%d", &x1, &y1, &x2, &y2);
    in[x1].push_back(make_pair(y1, y2));
    ou[x2 + 1].push_back(make_pair(y1, y2));
  }
  B(1, 1, m);
  Add(1, 1, 1);
  for (auto v : in[1]) {
    st.insert(v);
    Add(v.first, v.second, 0);
  }
  for (int i = (int)(2); i <= (int)(n); i++) {
    static int tot, vx[N], vc[N];
    tot = 0;
    for (auto v : in[i]) {
      if (v.second + 1 > m) continue;
      auto w = st.lower_bound(make_pair(v.second + 2, 0));
      int Low = 0;
      if (w != st.begin()) {
        --w;
        Low = w->second;
      }
      ++tot;
      vc[tot] = Ask(Low + 1, v.second + 1);
      vx[tot] = v.second + 1;
    }
    for (int j = (int)(1); j <= (int)(tot); j++) Add(vx[j], vx[j], vc[j]);
    for (auto v : ou[i]) st.erase(v);
    for (auto v : in[i]) {
      st.insert(v);
      Add(v.first, v.second, 0);
    }
  }
  int Low = (st.empty()) ? (0) : ((--st.end())->second);
  cout << Ask(Low + 1, m) << endl;
  return 0;
}
