#include <bits/stdc++.h>
using namespace std;
template <class T1, class T2>
void chmin(T1 &a, T2 b) {
  if (a > b) a = b;
}
template <class T1, class T2>
void chmax(T1 &a, T2 b) {
  if (a < b) a = b;
}
using Pi = pair<long long, long long>;
using Tapris = tuple<long long, long long, long long>;
using vint = vector<long long>;
const long long inf = 1LL << 55;
const long long mod = 1e9 + 7;
struct Combinatorics {
  using int64 = long long;
  const int64 mod = 1e9 + 7;
  int64 fact[302020];
  int64 invfact[302020];
  Combinatorics() {
    fact[0] = invfact[0] = 1;
    for (long long i = 1; i < 302020; ++i) {
      fact[i] = fact[i - 1] * i % mod;
      invfact[i] = minv(fact[i]);
    }
  }
  int64 mpow(int64 x, int64 n) const {
    int64 res = 1;
    while (n > 0) {
      if (n & 1) res = res * x % mod;
      x = x * x % mod;
      n >>= 1;
    }
    return res;
  }
  int64 minv(int64 x) const { return mpow(x, mod - 2); }
  int64 mfact(int64 x) const { return fact[x]; }
  int64 C(int64 n, int64 r) const {
    if (r < 0 || n < r) return 0;
    return fact[n] * invfact[r] % mod * invfact[n - r] % mod;
  }
  int64 P(int64 n, int64 r) const {
    if (r < 0 || n < r) return 0;
    return fact[n] * invfact[n - r] % mod;
  }
} C;
signed main() {
  cin.tie(0);
  ios_base::sync_with_stdio(0);
  cout << fixed << setprecision(12);
  long long N, M, K;
  cin >> N >> M >> K;
  assert(N + M + K < 100000);
  long long ans = 0;
  for (long long i = (long long)(N); i < (long long)(N + M + K + 1); i++) {
    long long leave = C.mpow(3, N + M + K - i);
    long long a = C.C(i - 1, N - 1);
    long long bc = 0;
    for (long long j = (long long)(0); j < (long long)(M + 1); j++) {
      if (i - N < j || i - N - j > K) continue;
      bc += C.C(i - N, j);
      bc %= mod;
    }
    ans += a * bc % mod * leave % mod;
    ans %= mod;
  }
  cout << ans << endl;
  return 0;
}
