#include <bits/stdc++.h>
using namespace std;
const int maxn = 75;
int dp[maxn][maxn];
int sta[maxn];
int k;
int pom[maxn][maxn];
int koliko = 0;
int kurac[maxn][maxn];
int dp2[maxn];
int pom2[maxn];
void uradi(int* niz, int n, int naj) {
  for (int i = 0; i < k; i++)
    for (int j = 0; j <= naj; j++) dp[i][j] = -1;
  dp[0][0] = 0;
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < k; j++) {
      for (int p = 0; p <= naj; p++) {
        pom[j][p] = dp[j][p];
        if (p > 0 && dp[((j - niz[i]) % k + k) % k][p - 1] != -1)
          pom[j][p] =
              max(pom[j][p], dp[((j - niz[i]) % k + k) % k][p - 1] + niz[i]);
      }
    }
    for (int j = 0; j < k; j++) {
      for (int p = 0; p <= naj; p++) {
        dp[j][p] = pom[j][p];
      }
    }
  }
  for (int i = 0; i < k; i++) {
    int maxi = -1;
    for (int j = 0; j <= naj; j++) {
      maxi = max(maxi, dp[i][j]);
    }
    kurac[koliko][i] = maxi;
  }
  koliko++;
}
void solve() {
  int n, m;
  cin >> n >> m >> k;
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) cin >> sta[j];
    uradi(sta, m, m / 2);
  }
  for (int i = 0; i < k; i++) dp2[i] = -1;
  dp2[0] = 0;
  for (int i = 0; i < koliko; i++) {
    for (int j = 0; j < k; j++) {
      pom2[j] = dp2[j];
      for (int p = 0; p < k; p++) {
        if (kurac[i][p] != -1)
          if (dp2[((j - p) % k + k) % k] != -1)
            pom2[j] = max(pom2[j], dp2[((j - p) % k + k) % k] + kurac[i][p]);
      }
    }
    for (int j = 0; j < k; j++) {
      dp2[j] = pom2[j];
    }
  }
  cout << dp2[0];
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  int t = 1;
  while (t--) solve();
  return 0;
}
