#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 16;
int n, y, a, b, dp[2][3];
// dp[i][0]表示对当前a不操作的最大值,dp[i][1]表示对当前a+b的最大值,dp[i][2]表示对当前a-b的最大值
// dp[0]表示前k个数的三种情况的最大值,dp[1]表示当前执行的第k + 1个数,因此只保留两行
inline void work(int i, int t)
{
for (int j = 0; j < 3; ++j)
dp[1][i] = max(dp[1][i], ((dp[0][j] + t) % y + y) % y);
}
int main()
{
int sum = 0;
scanf("%d%d", &n, &y);
for (int i = 1; i <= n; ++i)
{
scanf("%d", &a);
sum = (sum + a) % y;
}
for (int i = 0; i < 3; ++i)
dp[0][i] = sum; // 结果至少为sum
for (int i = 1; i <= n; ++i)
{
scanf("%d", &b);
for (int j = 0; j < 3; ++j)
dp[1][j] = sum;
// 对三种情况分别根据前k个的三种结果取最大值
work(0, 0);
work(1, b);
work(2, -b);
for (int j = 0; j < 3; ++j)
dp[0][j] = dp[1][j]; // 将前k + 1个的结果覆盖前k个结果以优化空间
}
printf("%d\n", max(max(dp[0][0], dp[0][1]), dp[0][2]));
return 0;
}