#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
const int N = 550;
using namespace std;
int n;
int m;
int k;
long long d[N][N][2];
long long cost[N][N];
vector<pair<int, long long> > R[N][N];
vector<pair<int, long long> > D[N][N];
vector<pair<int, long long> > nv;
void normal(vector<pair<int, long long> > &v) {
  sort(v.begin(), v.end());
  reverse(v.begin(), v.end());
  for (int i = 1; i < v.size(); i++) {
    v[i].second += v[i - 1].second;
  }
}
void upd(long long &x, long long y) { x = min(x, y); }
bool good(vector<pair<int, int> > &g, int i, int t) {
  int cur = g[i].first + g[i].second;
  if (cur >= t && (cur - t) % 4 == i) {
    return true;
  }
  return false;
}
int main() {
  ios_base::sync_with_stdio(0);
  scanf("%d%d%d", &n, &m, &k);
  vector<pair<int, int> > g;
  for (int i = 1, x, y, d, t, e; i <= k; i++) {
    scanf("%d%d%d%d%d", &x, &y, &d, &t, &e);
    g.clear();
    g.push_back({x, y});
    g.push_back({x + d, y - d});
    g.push_back({x + d, y});
    g.push_back({x, y + d});
    for (int i = 0; i < 4; i++) {
      if (good(g, i, t)) {
        cost[g[i].first][g[i].second] += e;
      }
    }
    if (good(g, 0, t) && good(g, 3, t)) {
      R[g[3].first][g[3].second].push_back({g[0].second, e});
    }
    if (good(g, 0, t) && good(g, 2, t)) {
      D[g[2].first][g[2].second].push_back({g[0].first, e});
    }
    if (good(g, 1, t) && good(g, 2, t)) {
      R[g[2].first][g[2].second].push_back({g[1].second, e});
    }
  }
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
      normal(R[i][j]);
      normal(D[i][j]);
    }
  }
  for (int i = 0; i <= n; i++) {
    for (int j = 0; j <= m; j++) {
      d[i][j][0] = 1e18;
      d[i][j][1] = 1e18;
    }
  }
  d[0][0][0] = 0;
  d[0][0][1] = 0;
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
      long long cnt = d[i][j][1];
      for (int h = j + 1; h < m; h++) {
        while (!R[i][h].empty() && R[i][h].back().first < j) {
          R[i][h].pop_back();
        }
        if (!R[i][h].empty()) {
          cnt -= R[i][h].back().second;
        }
        cnt += cost[i][h];
        upd(d[i][h][0], cnt);
      }
      cnt = d[i][j][0];
      for (int h = i + 1; h < n; h++) {
        while (!D[h][j].empty() && D[h][j].back().first < i) {
          D[h][j].pop_back();
        }
        if (!D[h][j].empty()) {
          cnt -= D[h][j].back().second;
        }
        cnt += cost[h][j];
        upd(d[h][j][1], cnt);
      }
    }
  }
  printf("%lld\n", min(d[n - 1][m - 1][0], d[n - 1][m - 1][1]) + cost[0][0]);
}
