#include <bits/stdc++.h>
using namespace std;
namespace debug {
void __(short x) { cout << x; }
void __(unsigned x) { cout << x; }
void __(int x) { cout << x; }
void __(long long x) { cout << x; }
void __(unsigned long long x) { cout << x; }
void __(double x) { cout << x; }
void __(long double x) { cout << x; }
void __(char x) { cout << x; }
void __(const char* x) { cout << x; }
void __(const string& x) { cout << x; }
void __(bool x) { cout << (x ? "true" : "false"); }
template <class P1, class P2>
void __(const pair<P1, P2>& x) {
  __("("), __(x.first), __(", "), __(x.second), __(")");
}
template <class T>
void __(const vector<T>& x) {
  __("{");
  bool _ffs = 0;
  for (const auto& v : x) __(_ffs ? ", " : ""), __(v), _ffs = 1;
  __("}");
}
template <class T>
void __(const set<T>& x) {
  __("{");
  bool _ffs = 0;
  for (const auto& v : x) __(_ffs ? ", " : ""), __(v), _ffs = 1;
  __("}");
}
template <class T, class T2>
void __(const map<T, T2>& x) {
  __("{");
  bool _ffs = 0;
  for (const auto& v : x)
    __(_ffs ? ", " : ""), __(make_pair(v.first, v.second)), _ffs = 1;
  __("}");
}
void screm() { __("\n"); }
template <class T1, class... T2>
void screm(const T1& t1, const T2&... t2) {
  __(t1);
  if (sizeof...(t2))
    __(" | "), screm(t2...);
  else
    __("\n");
}
void pr() { __("\n"); }
template <class T1, class... T2>
void pr(const T1& t1, const T2&... t2) {
  __(t1);
  if (sizeof...(t2))
    __(" "), pr(t2...);
  else
    __("\n");
}
}  // namespace debug
using namespace debug;
const int MN = 1e6 + 5, mod = 1e9 + 7;
int n, m, k, i, mx, mn, x, y, ans = 1, ok[MN];
int qpow(int b, int exp) {
  if (exp <= 0)
    return 1;
  else if (exp & 1)
    return 1LL * b * qpow(b, exp - 1) % mod;
  else {
    int r = qpow(b, exp >> 1);
    return 1LL * r * r % mod;
  }
}
int main() {
  scanf("%d%d%d", &n, &m, &k);
  mx = n - k - 1;
  mn = 1;
  for (int i = (1); i <= (m); i++) {
    scanf("%d%d", &x, &y);
    if (x + 1 == y) continue;
    if (y - x != k + 1)
      ans = 0;
    else {
      if (x < mn || x > mx) ans = 0;
      mn = max(mn, x - k);
      mx = min(mx, x + k);
      ok[x] = 1;
    }
  }
  if (!ans) {
    printf("0\n");
    return 0;
  }
  for (int i = (1); i <= (n); i++) ok[i] += ok[i - 1];
  for (int i = (mn); i <= (mx); i++) {
    if (ok[i] - ok[i - 1] == 0) {
      int h = min(i + k, mx) - i - (ok[min(i + k, mx)] - ok[i]);
      ans = (ans + qpow(2, h)) % mod;
    }
  }
  printf("%d\n", ans);
  return 0;
}
