#include <bits/stdc++.h>
using namespace std;
template <class T, class S>
ostream& operator<<(ostream& os, const pair<T, S>& v) {
  return os << "(" << v.first << ", " << v.second << ")";
}
template <class T>
ostream& operator<<(ostream& os, const vector<T>& v) {
  os << "[";
  for (int i = int(0); i <= int((static_cast<int>((v).size())) - 1); ++i) {
    if (i) os << ", ";
    os << v[i];
  }
  return os << "]";
}
template <class T>
bool setmax(T& _a, T _b) {
  if (_b > _a) {
    _a = _b;
    return true;
  }
  return false;
}
template <class T>
bool setmin(T& _a, T _b) {
  if (_b < _a) {
    _a = _b;
    return true;
  }
  return false;
}
template <class T>
T gcd(T _a, T _b) {
  return _b == 0 ? _a : gcd(_b, _a % _b);
}
const long long MOD = long long(1e9) + 7;
const int N = 300010;
long long m2[N], m3[N], inv[N], fac[N], inv_fac[N];
void pre() {
  m2[0] = m3[0] = 1;
  for (int i = int(1); i <= int(N - 1); ++i) {
    m2[i] = m2[i - 1] * 2 % MOD;
    m3[i] = m3[i - 1] * 3 % MOD;
  }
  inv[1] = 1;
  for (int i = int(2); i <= int(N - 1); ++i)
    inv[i] = (MOD - MOD / i) * inv[MOD % i] % MOD;
  fac[0] = inv_fac[0] = 1;
  for (int i = int(1); i <= int(N - 1); ++i) {
    fac[i] = fac[i - 1] * i % MOD;
    inv_fac[i] = inv_fac[i - 1] * inv[i] % MOD;
  }
}
long long binom(int n, int r) {
  if (r < 0 || r > n) return 0;
  long long ans = fac[n] * inv_fac[r] % MOD * inv_fac[n - r] % MOD;
  return ans;
}
int cn, cs, ct;
long long cans;
long long query(int n, int s, int t) {
  while (cn < n) {
    cans = (cans * 2 + binom(cn, cs - 1) - binom(cn, ct)) % MOD;
    ++cn;
  }
  while (cs < s) cans = (cans - binom(cn, cs++)) % MOD;
  while (cs > s) cans = (cans + binom(cn, --cs)) % MOD;
  while (ct < t) cans = (cans + binom(cn, ++ct)) % MOD;
  while (ct > t) cans = (cans - binom(cn, ct--)) % MOD;
  cans = (cans + MOD) % MOD;
  return cans;
}
int main() {
  ios_base::sync_with_stdio(false);
  pre();
  int n, m, k;
  cin >> n >> m >> k;
  --n;
  cn = cs = ct = 0, cans = 1;
  long long ans = 0;
  for (int p = int(0); p <= int(m + k); ++p) {
    long long cur = m3[m + k - p];
    (cur *= binom(n + p, n)) %= MOD;
    (cur *= query(p, max(0, p - k), min(p, m))) %= MOD;
    (ans += cur) %= MOD;
  }
  cout << ans << endl;
  return 0;
}
