#include <cstdio>
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <cmath>
using namespace std;

#define int long long
typedef pair<int, int> P;
#define rep(i, n) for (int i=0; i<(n); i++)
#define all(c) (c).begin(), (c).end()
#define _1 first
#define _2 second
#define pb push_back
#define INF 1145141919
#define MOD 1000000007

int N, M, K;
int p3[1000000];
int fact[1000000];

int modpow(int x, int k) {
  int a = 1;
  while (k > 0) {
    if (k & 1) a = (1LL*a*x) % MOD;
    x = (1LL*x*x) % MOD;
    k >>= 1;
  }
  return a;
}

int inv(int x) {
  return modpow(x, MOD-2);
}

int nCr(int n, int k) {
  if (n < 0 || k < 0 || n < k) return 0;
  return (1LL * fact[n] * inv((1LL*fact[k]*fact[n-k]) % MOD)) % MOD;
}

signed main() {
  ios::sync_with_stdio(false); cin.tie(0);
  cin >> N >> M >> K;
  if (M > K) swap(M, K);
  p3[0] = 1, fact[0] = 1;
  for (int i=1; i<=N+M+K; i++) {
    p3[i] = (3LL*p3[i-1]) % MOD;
    fact[i] = (1LL*i*fact[i-1]) % MOD;
  }
  int s = 0, lt = 0;
  for (int i=M+K; i>=0; i--) {
    int u = M+K-i;
    int l = max(0LL, u-M), r = min(u, K);
    int t = 0;
    if (i == M+K) t = 1;
    else {
      t = (2LL*lt - nCr(u-1, r) - nCr(u-1, l-1) + 2LL*MOD) % MOD;
    }
    s = (s + 1LL*((1LL*p3[i]*t)%MOD)*nCr(N+M+K-i-1, N-1)) % MOD;
    lt = t;
  }
  cout << s << "\n";
  return 0;
}
