#include <bits/stdc++.h>
using ll = long long;
using namespace std;
ll powmod(ll x, ll y, ll p) {
  assert(0 <= x and x < p);
  assert(0 <= y);
  ll z = 1;
  for (ll i = 1; i <= y; i <<= 1) {
    if (y & i) z = z * x % p;
    x = x * x % p;
  }
  return z;
}
ll inv(ll x, ll p) {
  assert((x % p + p) % p != 0);
  return powmod(x, p - 2, p);
}
template <int mod>
int fact(int n) {
  static vector<int> memo(1, 1);
  if (memo.size() <= n) {
    int l = memo.size();
    memo.resize(n + 1);
    for (int i = (l); (i) < int(n + 1); ++(i))
      memo[i] = memo[i - 1] * (ll)i % mod;
  }
  return memo[n];
}
template <int mod>
int choose(int n, int r) {
  if (n < r) return 0;
  r = min(r, n - r);
  return fact<mod>(n) * (ll)inv(fact<mod>(n - r), mod) % mod *
         (ll)inv(fact<mod>(r), mod) % mod;
}
constexpr ll mod = 1e9 + 7;
int main() {
  int n, m, k;
  scanf("%d%d%d", &n, &m, &k);
  ll result = 0;
  if (n == 0) {
    result += powmod(3, m + k, mod);
  } else {
    for (int l = (n); (l) < int(n + m + k + 1); ++(l)) {
      ll x = choose<mod>(l - 1, n - 1);
      ll y = 0;
      for (int i = (max(0, l - n - k)); (i) < int(min(l - n, m) + 1); ++(i)) {
        y += choose<mod>(l - n, i);
      }
      y %= mod;
      ll z = powmod(3, n + m + k - l, mod);
      result += x * y % mod * z % mod;
    }
  }
  result %= mod;
  printf("%lld\n", result);
  return 0;
}
