#include <bits/stdc++.h>
using namespace std;
struct fast_ios {
  fast_ios() {
    cin.tie(0);
    ios::sync_with_stdio(false);
    cout << fixed << setprecision(20);
  };
} fast_ios_;
using vec = vector<long long>;
using mat = vector<vec>;
using Pii = pair<long long, long long>;
using PiP = pair<long long, Pii>;
using PPi = pair<Pii, long long>;
using bools = vector<bool>;
using pairs = vector<Pii>;
template <typename T>
void readv(vector<T> &a) {
  for (long long i = (0); i < (a.size()); i++) cin >> a[i];
}
void readv_m1(vector<long long> &a) {
  for (long long i = (0); i < (a.size()); i++) {
    cin >> a[i];
    a[i]--;
  }
}
long long mod = 1000000007;
long long modpow(long long x, long long n, long long m) {
  long long a = 1;
  for (long long i = (64) - 1; i >= (0); i--) {
    a = (a * a) % m;
    if (((n >> i) & 1) == 1) a = (a * x) % m;
  }
  return a;
}
class Combination {
 public:
  vec fact, invfact;
  long long MAX_N, mod;
  Combination(long long MAX_N, long long mod) : MAX_N(MAX_N), mod(mod) {
    initialize();
  }
  void initialize() {
    fact = vec(MAX_N + 1);
    invfact = vec(MAX_N + 1);
    fact[0] = 1;
    for (long long i = (1); i < (MAX_N + 1); i++) {
      fact[i] = (fact[i - 1] * i) % mod;
    }
    invfact[MAX_N] = modpow(fact[MAX_N], mod - 2, mod);
    for (long long i = (MAX_N)-1; i >= (0); i--) {
      invfact[i] = (invfact[i + 1] * (i + 1)) % mod;
    }
  }
  long long nCr(long long n, long long r) {
    if (r > n || r < 0 || n < 0) return 0;
    if (n > MAX_N) {
      MAX_N = n;
      initialize();
    }
    long long a = fact[n];
    a = (a * invfact[r]) % mod;
    a = (a * invfact[n - r]) % mod;
    return a;
  }
  long long nPr(long long n, long long r) {
    if (r > n || r < 0 || n < 0) return 0;
    if (n > MAX_N) {
      MAX_N = n;
      initialize();
    }
    long long a = fact[n];
    a = (a * invfact[n - r]) % mod;
    return a;
  }
};
signed main() {
  long long N, M, K;
  cin >> N >> M >> K;
  assert(N <= 1000 && M <= 1000 && K <= 1000);
  long long ans = 0;
  Combination C(N + M + K, mod);
  long long c = 1;
  for (long long i = (0); i < (M + K + 1); i++) {
    if (i > 0) {
      c = (c * (2)) % mod;
      if (i - 1 >= M + 1) c = (c + (C.nCr(i - 1, M + 1))) % mod;
      if (i - 1 - K - 1 >= 0) c = (c + (C.nCr(i - 1, i - 1 - K - 1))) % mod;
      if (i >= M + 1) c = (c + (mod - C.nCr(i, M + 1))) % mod;
      if (i - K - 1 >= 0) c = (c + (mod - C.nCr(i, i - K - 1))) % mod;
    }
    long long tmp = (c * C.nCr(N - 1 + i, i)) % mod;
    ans = (ans + (tmp * modpow(3, M + K - i, mod))) % mod;
  }
  cout << ans << endl;
  return 0;
}
