#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#include <ext/pb_ds/trie_policy.hpp>
using namespace std;
using namespace __gnu_pbds;
typedef tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update> pbds;
typedef trie<string, null_type, trie_string_access_traits<>, pat_trie_tag, trie_prefix_search_node_update> pref_trie;
typedef unsigned long long BITMASK; typedef long long ll; typedef long double ld; typedef pair<int, int> pii; typedef pair<double, double> pdd; typedef pair<long long, long long> pll;
#define has_bit(bit_mask, x) ((bit_mask) & (1ULL << (x)))
#define turn_on_bit(bit_mask, x) (bit_mask |= (1ULL << (x)))
#define turn_off_bit(bit_mask, x) (bit_mask &= (~(1ULL << (x))))
#define smallest_on_bit(bit_mask) (__builtin_ctzint((bit_mask) & (-(bit_mask))))
#define CLOCK_START clock_t chrono_clk_beg = clock()
#define CLOCK_END clock_t chrono_clk_end = clock(); cerr << (double(chrono_clk_end - chrono_clk_beg) / CLOCKS_PER_SEC) << " sec"
#define bug(args ...) cerr << __LINE__ << ">> ", err(new istringstream(string(#args)), args), cerr << '\n'
#define decToBin(name, num) string name = bitset<8>(num).to_string();
#define binToDec(name, binary) unsigned long name = bitset<8>(binary).to_ulong();
#define radToDeg(name, radians) double name = radians * 180 / M_PI;
#define all(x) x.begin(), x.end()
#define removeDuplicates(vec) sort(vec.begin(), vec.end()); vec.erase(unique(vec.begin(), vec.end()), vec.end())
#define printMat(mat) for (auto &x : mat) { for (auto &y : x) { if (y < INF) cout << setw(7) << y; else cout << setw(7) << "-"; } cout << '\n'; }
#define fillMat(mat, n, m, x) for (int i = 0; i < n; ++i) for (int j = 0; j < m; ++j) mat[i][j] = x;
#define printArr(arr) for (auto &x : arr) cout << x << " "; cout << '\n';
#define arrReplace(arr, from, to) for (auto &x : arr) if (x == from) x = to;
#define INF (1LL<<30)
#define INF32 (1LL<<62)
#define F first
#define S second
#define M_PI 3.14159265358979323846
#define MOD 10000007
#define int ll
inline int powMod(int a, int b) { int x = 1; while (b > 0) { if (b&1) x = (x*a) % MOD; a = (a*a) % MOD; b >>= 1; } return x; }
inline int multiply(int x, int y) { return ((x % MOD) * (y % MOD)) % MOD; }
inline int divide(int x, int y) { return ((x % MOD) * powMod(y % MOD, MOD-2)) % MOD; }
inline int gcd (int a, int b) { while (b) { a %= b; swap(a, b); } return a; }
inline int lcm (int a, int b) { return a / gcd(a, b) * b; }
inline int ceil(int a, int b) { return (a+b-1)/b; }
void err(istringstream *iss) {} template<typename T, typename ... Args> void err(istringstream *iss, const T &_val, const Args & ... args) { string _name; *iss >> _name; if (_name.back()==',') _name.pop_back(); cerr << _name << " = " << _val << "; ", err(iss, args ...); }
int str_replace(string& str, const string& from, const string& to, int limit = -1) { if(from.empty()) return 0; size_t start_pos = 0; int cnt = 0; while((start_pos = str.find(from, start_pos)) != std::string::npos) { str.replace(start_pos, from.length(), to); start_pos += to.length(); cnt++; if (cnt == limit) break; } return cnt; }
signed main()
{
ios_base::sync_with_stdio(false); cin.tie(NULL);
int n, k;
while (cin >> n >> k)
{
if (n == 0 || k == 0) break;
int ans = multiply(2, powMod(n-1, n-1));
ans = (ans + powMod(n, n)) % MOD;
ans = (ans + multiply(2, powMod(n-1, k))) % MOD;
ans = (ans + powMod(n, k)) % MOD;
cout << ans << '\n';
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNpbmNsdWRlIDxleHQvcGJfZHMvYXNzb2NfY29udGFpbmVyLmhwcD4KI2luY2x1ZGUgPGV4dC9wYl9kcy90cmVlX3BvbGljeS5ocHA+CiNpbmNsdWRlIDxleHQvcGJfZHMvdHJpZV9wb2xpY3kuaHBwPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwp1c2luZyBuYW1lc3BhY2UgX19nbnVfcGJkczsKdHlwZWRlZiB0cmVlPGludCwgbnVsbF90eXBlLCBsZXNzPGludD4sIHJiX3RyZWVfdGFnLCB0cmVlX29yZGVyX3N0YXRpc3RpY3Nfbm9kZV91cGRhdGU+IHBiZHM7CnR5cGVkZWYgdHJpZTxzdHJpbmcsIG51bGxfdHlwZSwgdHJpZV9zdHJpbmdfYWNjZXNzX3RyYWl0czw+LCBwYXRfdHJpZV90YWcsIHRyaWVfcHJlZml4X3NlYXJjaF9ub2RlX3VwZGF0ZT4gcHJlZl90cmllOwp0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBCSVRNQVNLOyB0eXBlZGVmIGxvbmcgbG9uZyBsbDsgdHlwZWRlZiBsb25nIGRvdWJsZSBsZDsgdHlwZWRlZiBwYWlyPGludCwgaW50PiBwaWk7IHR5cGVkZWYgcGFpcjxkb3VibGUsIGRvdWJsZT4gcGRkOyB0eXBlZGVmIHBhaXI8bG9uZyBsb25nLCBsb25nIGxvbmc+IHBsbDsKI2RlZmluZSBoYXNfYml0KGJpdF9tYXNrLCB4KSAoKGJpdF9tYXNrKSAmICgxVUxMIDw8ICh4KSkpCiNkZWZpbmUgdHVybl9vbl9iaXQoYml0X21hc2ssIHgpIChiaXRfbWFzayB8PSAoMVVMTCA8PCAoeCkpKQojZGVmaW5lIHR1cm5fb2ZmX2JpdChiaXRfbWFzaywgeCkgKGJpdF9tYXNrICY9ICh+KDFVTEwgPDwgKHgpKSkpCiNkZWZpbmUgc21hbGxlc3Rfb25fYml0KGJpdF9tYXNrKSAoX19idWlsdGluX2N0emludCgoYml0X21hc2spICYgKC0oYml0X21hc2spKSkpCiNkZWZpbmUgQ0xPQ0tfU1RBUlQgY2xvY2tfdCBjaHJvbm9fY2xrX2JlZyA9IGNsb2NrKCkKI2RlZmluZSBDTE9DS19FTkQgY2xvY2tfdCBjaHJvbm9fY2xrX2VuZCA9IGNsb2NrKCk7IGNlcnIgPDwgKGRvdWJsZShjaHJvbm9fY2xrX2VuZCAtIGNocm9ub19jbGtfYmVnKSAvIENMT0NLU19QRVJfU0VDKSA8PCAiIHNlYyIKI2RlZmluZSBidWcoYXJncyAuLi4pIGNlcnIgPDwgX19MSU5FX18gPDwgIj4+ICIsIGVycihuZXcgaXN0cmluZ3N0cmVhbShzdHJpbmcoI2FyZ3MpKSwgYXJncyksIGNlcnIgPDwgJ1xuJwojZGVmaW5lIGRlY1RvQmluKG5hbWUsIG51bSkgc3RyaW5nIG5hbWUgPSBiaXRzZXQ8OD4obnVtKS50b19zdHJpbmcoKTsKI2RlZmluZSBiaW5Ub0RlYyhuYW1lLCBiaW5hcnkpIHVuc2lnbmVkIGxvbmcgbmFtZSA9IGJpdHNldDw4PihiaW5hcnkpLnRvX3Vsb25nKCk7CiNkZWZpbmUgcmFkVG9EZWcobmFtZSwgcmFkaWFucykgZG91YmxlIG5hbWUgPSByYWRpYW5zICogMTgwIC8gTV9QSTsKI2RlZmluZSBhbGwoeCkgeC5iZWdpbigpLCB4LmVuZCgpCiNkZWZpbmUgcmVtb3ZlRHVwbGljYXRlcyh2ZWMpIHNvcnQodmVjLmJlZ2luKCksIHZlYy5lbmQoKSk7IHZlYy5lcmFzZSh1bmlxdWUodmVjLmJlZ2luKCksIHZlYy5lbmQoKSksIHZlYy5lbmQoKSkKI2RlZmluZSBwcmludE1hdChtYXQpIGZvciAoYXV0byAmeCA6IG1hdCkgeyBmb3IgKGF1dG8gJnkgOiB4KSB7IGlmICh5IDwgSU5GKSBjb3V0IDw8IHNldHcoNykgPDwgeTsgZWxzZSBjb3V0IDw8IHNldHcoNykgPDwgIi0iOyB9IGNvdXQgPDwgJ1xuJzsgfQojZGVmaW5lIGZpbGxNYXQobWF0LCBuLCBtLCB4KSBmb3IgKGludCBpID0gMDsgaSA8IG47ICsraSkgZm9yIChpbnQgaiA9IDA7IGogPCBtOyArK2opIG1hdFtpXVtqXSA9IHg7CiNkZWZpbmUgcHJpbnRBcnIoYXJyKSBmb3IgKGF1dG8gJnggOiBhcnIpIGNvdXQgPDwgeCA8PCAiICI7IGNvdXQgPDwgJ1xuJzsKI2RlZmluZSBhcnJSZXBsYWNlKGFyciwgZnJvbSwgdG8pIGZvciAoYXV0byAmeCA6IGFycikgaWYgKHggPT0gZnJvbSkgeCA9IHRvOwojZGVmaW5lIElORiAoMUxMPDwzMCkKI2RlZmluZSBJTkYzMiAoMUxMPDw2MikKI2RlZmluZSBGIGZpcnN0CiNkZWZpbmUgUyBzZWNvbmQKI2RlZmluZSBNX1BJIDMuMTQxNTkyNjUzNTg5NzkzMjM4NDYKI2RlZmluZSBNT0QgMTAwMDAwMDcKI2RlZmluZSBpbnQgbGwKaW5saW5lIGludCBwb3dNb2QoaW50IGEsIGludCBiKSB7IGludCB4ID0gMTsgd2hpbGUgKGIgPiAwKSB7IGlmIChiJjEpIHggPSAoeCphKSAlIE1PRDsgYSA9IChhKmEpICUgTU9EOyBiID4+PSAxOyB9IHJldHVybiB4OyB9CmlubGluZSBpbnQgbXVsdGlwbHkoaW50IHgsIGludCB5KSB7IHJldHVybiAoKHggJSBNT0QpICogKHkgJSBNT0QpKSAlIE1PRDsgfQppbmxpbmUgaW50IGRpdmlkZShpbnQgeCwgaW50IHkpIHsgcmV0dXJuICgoeCAlIE1PRCkgKiBwb3dNb2QoeSAlIE1PRCwgTU9ELTIpKSAlIE1PRDsgfQppbmxpbmUgaW50IGdjZCAoaW50IGEsIGludCBiKSB7IHdoaWxlIChiKSB7IGEgJT0gYjsgc3dhcChhLCBiKTsgfSByZXR1cm4gYTsgfQppbmxpbmUgaW50IGxjbSAoaW50IGEsIGludCBiKSB7IHJldHVybiBhIC8gZ2NkKGEsIGIpICogYjsgfQppbmxpbmUgaW50IGNlaWwoaW50IGEsIGludCBiKSB7IHJldHVybiAoYStiLTEpL2I7IH0Kdm9pZCBlcnIoaXN0cmluZ3N0cmVhbSAqaXNzKSB7fSB0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSAuLi4gQXJncz4gdm9pZCBlcnIoaXN0cmluZ3N0cmVhbSAqaXNzLCBjb25zdCBUICZfdmFsLCBjb25zdCBBcmdzICYgLi4uIGFyZ3MpIHsgc3RyaW5nIF9uYW1lOyAqaXNzID4+IF9uYW1lOyBpZiAoX25hbWUuYmFjaygpPT0nLCcpIF9uYW1lLnBvcF9iYWNrKCk7IGNlcnIgPDwgX25hbWUgPDwgIiA9ICIgPDwgX3ZhbCA8PCAiOyAiLCBlcnIoaXNzLCBhcmdzIC4uLik7IH0KaW50IHN0cl9yZXBsYWNlKHN0cmluZyYgc3RyLCBjb25zdCBzdHJpbmcmIGZyb20sIGNvbnN0IHN0cmluZyYgdG8sIGludCBsaW1pdCA9IC0xKSB7IGlmKGZyb20uZW1wdHkoKSkgcmV0dXJuIDA7IHNpemVfdCBzdGFydF9wb3MgPSAwOyBpbnQgY250ID0gMDsgd2hpbGUoKHN0YXJ0X3BvcyA9IHN0ci5maW5kKGZyb20sIHN0YXJ0X3BvcykpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7IHN0ci5yZXBsYWNlKHN0YXJ0X3BvcywgZnJvbS5sZW5ndGgoKSwgdG8pOyBzdGFydF9wb3MgKz0gdG8ubGVuZ3RoKCk7IGNudCsrOyBpZiAoY250ID09IGxpbWl0KSBicmVhazsgfSByZXR1cm4gY250OyB9CgpzaWduZWQgbWFpbigpCnsKCWlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOyBjaW4udGllKE5VTEwpOwoJaW50IG4sIGs7Cgl3aGlsZSAoY2luID4+IG4gPj4gaykKCXsKCQlpZiAobiA9PSAwIHx8IGsgPT0gMCkgYnJlYWs7CgkJaW50IGFucyA9IG11bHRpcGx5KDIsIHBvd01vZChuLTEsIG4tMSkpOwoJCWFucyA9IChhbnMgKyBwb3dNb2QobiwgbikpICUgTU9EOwoJCWFucyA9IChhbnMgKyBtdWx0aXBseSgyLCBwb3dNb2Qobi0xLCBrKSkpICUgTU9EOwoJCWFucyA9IChhbnMgKyBwb3dNb2QobiwgaykpICUgTU9EOwoJCWNvdXQgPDwgYW5zIDw8ICdcbic7Cgl9CglyZXR1cm4gMDsKfQ==