#pragma GCC optimize("O3")
#include <bits/stdc++.h>
using namespace std;

#define ll long long
#define rep(i, n) for(ll i = 0; i < n; ++i)
#define rep2(i, a, b) for(ll i = a; i <= b; ++i)
#define rep3(i, a, b) for(ll i = a; i >= b; --i)
#define eb emplace_back
#define pb push_back
#define all(c) (c).begin(), (c).end()
#define vi vector<int>
#define N 100100
#define MOD 1000000007 //998244353
#define pii pair<int,int>
#define pll pair<ll,ll>


int main() {
	ll n;
	vector<ll>a;
	vector<ll>b;
	ll x, y, z;
	ll l[N];
	ll r[N];
	bool v;
	ll s, ans;
	cin >> n >> x;
	a.pb(0);
	rep(i, n) {
		cin >> y;
		a.pb(y);
	}
	a.pb(x + 1);
	b.pb(0);
	rep(i, n) {
		cin >> y;
		b.pb(y);
	}
	b.pb(x + 1);
	x = 0;
	n += 2;
	rep(i, n) {
		l[i] = -1;
		r[i] = -1;
	}
	rep(i, n) {
		while (true) {
			if (x >= i) {
				if (a[x] + (i - x) < b[i])x++;
				else break;
			}
			else {
				if (a[x + 1] + (i - x - 1) > b[i])break;
				else x++;
			}
		}
		if (a[x] + (i - x) != b[i]) {
			cout << -1 << endl;
			return 0;
		}
		if (l[x] == -1)l[x] = i;
		r[x] = i;
	}
	ans = 0;
	rep(i,n) {
		if (l[i] >= 0) {
			if (l[i] < i) {
				ans += (i - l[i]);
			}
			if (r[i] > i) {
				ans += (r[i] - i);
			}
		}
	}
	cout << ans << endl;
	return 0;
}

#include <bits/stdc++.h>
#define FASTIO
using namespace std;

using ll = long long;
using Vi = std::vector<int>;
using Vl = std::vector<ll>;
using Pii = std::pair<int, int>;
using Pll = std::pair<ll, ll>;

constexpr int I_INF = std::numeric_limits<int>::max();
constexpr ll L_INF = std::numeric_limits<ll>::max();

template <typename T1, typename T2>
inline bool chmin(T1& a, const T2& b) {
    if (a > b) {
        a = b;
        return true;
    }
    return false;
}
template <typename T1, typename T2>
inline bool chmax(T1& a, const T2& b) {
    if (a < b) {
        a = b;
        return true;
    }
    return false;
}

class Prints {
private:
    class __Prints {
    public:
        __Prints(const char* sep, const char* term) : sep(sep), term(term) {}
        template <class... Args>
        void operator()(const Args&... args) const { print(args...); }
        template <typename T>
        void pvec(const T& vec, size_t sz) const {
            for (size_t i = 0; i < sz; i++)
                std::cout << vec[i] << (i == sz - 1 ? term : sep);
        }
        template <typename T>
        void pmat(const T& mat, size_t h, size_t w) {
            for (size_t i = 0; i < h; i++)
                for (size_t j = 0; j < w; j++)
                    std::cout << mat[i][j] << (j == w - 1 ? term : sep);
        }

    private:
        const char *sep, *term;
        void print() const { std::cout << term; }
        void print_rest() const { std::cout << term; }
        template <class T, class... Tail>
        void print(const T& head, const Tail&... tail) const { std::cout << head, print_rest(tail...); }
        template <class T, class... Tail>
        void print_rest(const T& head, const Tail&... tail) const { std::cout << sep << head, print_rest(tail...); }
    };

public:
    Prints() {}
    __Prints operator()(const char* sep = " ", const char* term = "\n") const { return __Prints(sep, term); }
};

Prints prints;

//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

void solve() {
    ll N, L;
    cin >> N >> L;
    Vl A(N + 2), B(N + 2);
    for (ll i = 1; i <= N; i++) {
        cin >> A[i];
        A[i] -= i;
    }
    for (ll i = 1; i <= N; i++) {
        cin >> B[i];
        B[i] -= i;
    }
    A[N + 1] = B[N + 1] = (L + 1) - (N + 1);

    Vl pos = B;
    pos.erase(unique(pos.begin(), pos.end()), pos.end());

    ll ans = 0;
    for (auto p : pos) {
        int idxl_a = lower_bound(A.begin(), A.end(), p) - A.begin();
        int idxr_a = upper_bound(A.begin(), A.end(), p) - A.begin();
        int idxl_b = lower_bound(B.begin(), B.end(), p) - B.begin();
        int idxr_b = upper_bound(B.begin(), B.end(), p) - B.begin();
        if (idxr_a - idxl_a == 0) {
            prints()(-1);
            return;
        }
        ans += max(idxr_b - idxr_a, 0) + max(idxl_a - idxl_b, 0);
    }

    prints()(ans);
}

//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

int main() {
#ifdef FASTIO
    std::cin.tie(nullptr), std::cout.tie(nullptr);
    std::ios::sync_with_stdio(false);
#endif
#ifdef FILEINPUT
    std::ifstream ifs("./in_out/input.txt");
    std::cin.rdbuf(ifs.rdbuf());
#endif
#ifdef FILEOUTPUT
    std::ofstream ofs("./in_out/output.txt");
    std::cout.rdbuf(ofs.rdbuf());
#endif
    std::cout << std::setprecision(18) << std::fixed;
    solve();
    std::cout << std::flush;
    return 0;
}