#include <bits/stdc++.h>
int n, m, k;
int d1[100010], f1[100010], t1[100010], c1[100010];
int d2[100010], f2[100010], t2[100010], c2[100010];
int idx[100010];
long long cs1[1000010], cs2[1000010];
int vis[100010], num;
int m1, m2;
int cost1[100010];
int sign1[1000010];
int cost2[100010];
int sign2[1000010];
long long res;
int mk1, mk2;
int s1, s2;
int d3[100010], f3[100010], t3[100010], c3[100010];
int cmp(const void *aa, const void *bb) {
  int i1 = *((int *)aa);
  int i2 = *((int *)bb);
  return d1[i1] - d1[i2];
}
int cmp2(const void *aa, const void *bb) {
  int i1 = *((int *)aa);
  int i2 = *((int *)bb);
  return d2[i2] - d2[i1];
}
void solve() {
  int i, j;
  s1 = 1000000000;
  s2 = -1;
  for (i = 0; i < m1; i++) idx[i] = i;
  qsort(idx, m1, sizeof(int), cmp);
  num = 0;
  j = 0;
  int ff;
  mk1 = 0;
  for (i = 0; i < m1; i++) {
    if (mk1 < d1[i]) mk1 = d1[i];
  }
  for (i = 0; i <= mk1; i++) {
    cs1[i + 1] = cs1[i];
    if (sign1[i] == 1) sign1[i + 1] = 1;
    while (j < m1 && d1[idx[j]] <= i) {
      ff = f1[idx[j]];
      if (vis[ff] == 0) {
        num++;
        vis[ff] = 1;
        cs1[i + 1] += c1[idx[j]];
        cost1[ff] = c1[idx[j]];
        if (num == n) {
          sign1[i + 1] = 1;
          s1 = i + 1;
        }
      } else {
        if (cost1[ff] > c1[idx[j]]) {
          cs1[i + 1] += c1[idx[j]] - cost1[ff];
          cost1[ff] = c1[idx[j]];
        }
        if (num == n) sign1[i + 1] = 1;
      }
      j++;
    }
  }
  for (i = 0; i < m2; i++) idx[i] = i;
  qsort(idx, m2, sizeof(int), cmp2);
  for (i = 0; i <= n; i++) vis[i] = 0;
  num = 0;
  j = 0;
  int tt;
  mk2 = 0;
  for (i = 0; i < m2; i++) {
    if (mk2 < d2[i]) mk2 = d2[i];
  }
  for (i = mk2; i > 0; i--) {
    cs2[i - 1] = cs2[i];
    if (sign2[i] == 1) sign2[i - 1] = 1;
    while (j < m2 && d2[idx[j]] >= i) {
      tt = t2[idx[j]];
      if (vis[tt] == 0) {
        num++;
        vis[tt] = 1;
        cs2[i - 1] += c2[idx[j]];
        cost2[tt] = c2[idx[j]];
        if (num == n) {
          sign2[i - 1] = 1;
          s2 = i - 1;
        }
      } else {
        if (cost2[tt] > c2[idx[j]]) {
          cs2[i - 1] += c2[idx[j]] - cost2[tt];
          cost2[tt] = c2[idx[j]];
        }
        if (num == n) sign2[i - 1] = 1;
      }
      j++;
    }
  }
  for (i = mk1 + 2; i <= mk2 + 1; i++) cs1[i] = cs1[i - 1];
  res = -1;
  for (i = 0; i <= mk1 + 1; i++) {
    if ((i >= s1 && i + k - 1 <= mk2 && i + k - 1 <= s2) &&
        (res == -1 || res > cs1[i] + cs2[i + k - 1]))
      res = cs1[i] + cs2[i + k - 1];
  }
  for (i = mk2; i > 0; i--) {
    if ((i - k + 1 >= 0 && i - k + 1 >= s1 && i <= s2) &&
        (res == -1 || res > cs1[i - k + 1] + cs2[i]))
      res = cs1[i - k + 1] + cs2[i];
  }
  printf("%I64d\n", res);
}
int main() {
  int i;
  scanf("%d%d%d", &n, &m, &k);
  int dd, ff, tt, cc;
  m1 = m2 = 0;
  for (i = 0; i < m; i++) {
    scanf("%d%d%d%d", &dd, &ff, &tt, &cc);
    d3[i] = dd;
    f3[i] = ff;
    t3[i] = tt;
    c3[i] = cc;
    if (tt == 0) {
      d1[m1] = dd;
      f1[m1] = ff;
      t1[m1] = tt;
      c1[m1] = cc;
      m1++;
    } else {
      d2[m2] = dd;
      f2[m2] = ff;
      t2[m2] = tt;
      c2[m2] = cc;
      m2++;
    }
  }
  solve();
  return 0;
}
