#include <bits/stdc++.h>
using namespace std;
using Edge = pair<long long, long long>;
using Graph = vector<vector<int>>;
inline int toInt(string s) {
  int v;
  istringstream sin(s);
  sin >> v;
  return v;
}
template <class T>
inline string toString(T x) {
  ostringstream sout;
  sout << x;
  return sout.str();
}
template <class T>
bool chmax(T &a, const T &b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T>
bool chmin(T &a, const T &b) {
  if (b < a) {
    a = b;
    return 1;
  }
  return 0;
}
const int dx[4] = {0, 1, 0, -1}, dy[4] = {1, 0, -1, 0};
long long gcd(long long a, long long b) { return b ? gcd(b, a % b) : a; }
long long lcm(long long a, long long b) { return a / gcd(a, b) * b; }
long long fac[2010101], finv[2010101], inv[2010101];
void COM_init() {
  fac[0] = fac[1] = 1;
  finv[0] = finv[1] = 1;
  inv[1] = 1;
  for (long long i = 2; i < 2010101; ++i) {
    fac[i] = fac[i - 1] * i % 1000000007;
    inv[i] = 1000000007 - inv[1000000007 % i] * (1000000007 / i) % 1000000007;
    finv[i] = finv[i - 1] * inv[i] % 1000000007;
  }
}
long long COM(long long n, long long k) {
  if (n < k) return 0;
  if (n < 0 || k < 0) return 0;
  return fac[n] * (finv[k] * finv[n - k] % 1000000007) % 1000000007;
}
int main() {
  long long N, M, K, ans = 0;
  cin >> N >> M >> K;
  COM_init();
  long long POW3[500001];
  POW3[0] = 1;
  for (int i = (1); i <= (500000); ++i) POW3[i] = POW3[i - 1] * 3 % 1000000007;
  for (int i = (1); i <= (N + M + K); ++i) {
    long long cnt = 1, ccnt = 0;
    cnt *= POW3[N + M + K - i];
    cnt %= 1000000007;
    cnt *= COM(i - 1, N - 1);
    cnt %= 1000000007;
    for (long long j = 0; j <= i - N; ++j) {
      if (j <= M && i - N - j <= K) ccnt += COM(i - N, j);
      ccnt %= 1000000007;
    }
    cnt *= ccnt;
    cnt %= 1000000007;
    ans += cnt;
    ans %= 1000000007;
  }
  ans = (ans % 1000000007 + 1000000007) % 1000000007;
  cout << ans << '\n';
  return 0;
}
