#include <bits/stdc++.h>
using namespace std;
template <typename A, typename B>
bool cmin(A &a, const B &b) {
  return a > b ? (a = b, true) : false;
}
template <typename A, typename B>
bool cmax(A &a, const B &b) {
  return a < b ? (a = b, true) : false;
}
const double PI = acos(-1);
const double EPS = 1e-9;
long long inf = sizeof(long long) == sizeof(long long) ? 2e18 : 1e9 + 10;
long long dx[] = {0, 1, 0, -1};
long long dy[] = {1, 0, -1, 0};
vector<long long> fact;
bool h = false;
void init() {
  h = true;
  fact = vector<long long>(1000000);
  fact[0] = fact[1] = 1;
  for (long long i = 2; i < 1000000; i++)
    fact[i] = fact[i - 1] * i % 1000000007;
}
long long powmod(long long a, long long b, long long m = 1000000007) {
  long long out = 1;
  long long p = a % m;
  while (b) {
    if (b & 1) out = out * p % m;
    p = p * p % m;
    b >>= 1;
  }
  return out;
}
long long nCr(long long n, long long r, long long m = 1000000007) {
  if (!h) init();
  if (n < 0 || r < 0 || n < r) return 1;
  long long out = fact[n] * powmod(fact[r] * fact[n - r] % m, m - 2, m) % m;
  return out;
}
signed main() {
  long long out = 0;
  long long n, m, k;
  cin >> n >> m >> k;
  assert(n <= 1000);
  assert(m <= 1000);
  assert(k <= 1000);
  for (long long i = n - 1; i < n + m + k; i++) {
    long long t = powmod(3, n + m + k - i - 1) * nCr(i, n - 1) % 1000000007;
    long long T = 0, w = i + 1 - n;
    for (long long j = 0; j < w + 1; j++) {
      if (j > m || w - j > k) continue;
      (T += nCr(w, j)) %= 1000000007;
    }
    (out += t * T) %= 1000000007;
  }
  cout << out << endl;
}
