#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int a[25][25];
ll L[25][110000], R[25][110000];
int lc[25], rc[25];
int n, M;
ll qp;
ll fp(int b, int e, int M)
{
ll r = 1, p = b;
while (e)
{
if (e & 1)
r = (r * p) % M;
p = (p * p) % M;
e >>= 1;
}
return r;
}
void dfsL(int x, int y, int d, ll v)
{
if (d == n - 1)
{
L[x][lc[x]++] = v;
return;
}
if (x < n)
dfsL(x + 1, y, d + 1, (v * 10 + a[x + 1][y]) % M);
if (y < n)
dfsL(x, y + 1, d + 1, (v * 10 + a[x][y + 1]) % M);
}
void dfsR(int x, int y, int d, ll v, int r)
{
if (d == n - 1)
{
if (x == n && y == n)
R[r][rc[r]++] = v;
return;
}
if (x < n)
dfsR(x + 1, y, d + 1, (v * 10 + a[x + 1][y]) % M, r);
if (y < n)
dfsR(x, y + 1, d + 1, (v * 10 + a[x][y + 1]) % M, r);
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
cin >> n >> M;
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
cin >> a[i][j];
}
}
dfsL(1, 1, 0, (ll)a[1][1] % M);
for (int i = 1; i <= n; i++)
{
int j = n + 1 - i;
if (j >= 1 && j <= n)
dfsR(i, j, 0, 0, i);
}
qp = fp(10, n - 1, M);
ll ans = -1;
for (int i = 1; i <= n; i++)
{
if (lc[i] == 0 || rc[i] == 0)
continue;
sort(R[i], R[i] + rc[i]);
for (int j = 0; j < lc[i]; j++)
{
ll lv = (L[i][j] * qp) % M;
ll tar = M - 1 - lv;
int lo = 0, hi = rc[i] - 1, pos = -1;
while (lo <= hi)
{
int mid = lo + ((hi - lo) >> 1);
if (R[i][mid] <= tar)
{
pos = mid;
lo = mid + 1;
}
else
hi = mid - 1;
}
if (pos != -1)
ans = max(ans, lv + R[i][pos]);
lo = 0, hi = rc[i] - 1, pos = -1;
while (lo <= hi)
{
int mid = lo + ((hi - lo) >> 1);
if (R[i][mid] > tar)
{
pos = mid;
hi = mid - 1;
}
else
lo = mid + 1;
}
if (pos != -1)
ans = max(ans, (lv + R[i][pos]) % M);
}
}
cout << ans;
return 0;
}