//#include <bits/stdc++.h>

using namespace std;
using ll = long long;
using ld = long double;
using p = pair<int, int>;
using Graph = vector<vector<char>>;
#define rep(i,n)  for(int i = 0; i < n ; i++)
#define chmax(x,y) x = max(x,y);
int dx[4]{ -1,0,1,0 };
int dy[4]{ 0,1,0,-1 };
const ll INF = 1e18;
// auto mod int int で入れてmodで割った値を返すLibrary
const int  mod = 1000000007;
struct mint {
	ll x;
	mint(ll x = 0) :x((x% mod + mod) % mod) {}
	mint operator -() const { return mint(-x); }
	mint& operator +=(const mint a) {
		if ((x += a.x) >= mod) x -= mod;
		return *this;
	}
	mint& operator -=(const mint a) {
		if ((x += mod - a.x) >= mod) x -= mod;
		return *this;
	}
	mint& operator*= (const mint a) { (x *= a.x) %= mod; return *this; }
	mint operator+(const mint a)const { return mint(*this) += a; }
	mint operator-(const mint a)const { return mint(*this) -= a; }
	mint operator*(const mint a)const { return mint(*this) *= a; }

	mint pow(ll t) const {
		if (!t) return 1;
		mint a = pow(t >> 1);
		a *= a;
		if (t & 1) a *= *this;
		return a;
	}
	// for prime mode
	mint inv() const { return pow(mod - 2); }
	mint& operator /= (const mint a) { return *this *= a.inv(); }
	mint operator / (const mint a) const { return mint(*this) /= a; }
};
istream& operator >>(istream& is, const mint& a) { return is >> a.x; }
ostream& operator <<(ostream& os, const mint& a) { return os << a.x; }

ll sum(ll l, ll r) {
	return (1 + r) * (r - l + 1) / 2;
}

int main() {
	int n, k;
	cin >> n >> k;
	mint ans;
	for (int i = 0; i <= n+1; i++)
	{
		ll l = sum(0, i - 1), r = sum(n - i + 1, n);
		ans += r - l + 1;
	}
	cout << ans << endl;
	return 0;
}
