#include <bits/stdc++.h>
using namespace std;
long long N, M, K;
long long p3[700000];
long long fact[700000];
long long s[700000];
long long memo[1001][2002];
long long modpow(long long x, long long k) {
  long long a = 1;
  while (k > 0) {
    if (k & 1) a = (1LL * a * x) % 1000000007;
    x = (1LL * x * x) % 1000000007;
    k >>= 1;
  }
  return a;
}
long long inv(long long x) { return modpow(x, 1000000007 - 2); }
long long nCr(long long n, long long k) {
  if (n < 0 || k < 0 || n < k) return 0;
  return (1LL * fact[n] * inv((1LL * fact[k] * fact[n - k]) % 1000000007)) %
         1000000007;
}
long long f(long long a, long long b) {
  if (memo[a][b] != 0) return memo[a][b];
  if (a == 0) {
    return memo[a][b] = (1LL * p3[b] * s[M + K - b]) % 1000000007;
  }
  long long s = 0;
  s = (s + f(a - 1, b)) % 1000000007;
  if (b > 0) s = (s + f(a, b - 1)) % 1000000007;
  return memo[a][b] = s;
}
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 (long long i = 1; i <= M + K; i++) {
    p3[i] = (3LL * p3[i - 1]) % 1000000007;
    fact[i] = (1LL * i * fact[i - 1]) % 1000000007;
  }
  for (long long u = 0; u <= M + K; u++) {
    long long m = 0;
    for (long long i = max(0LL, u - M); i <= K; i++)
      m = (m + nCr(u, i)) % 1000000007;
    s[u] = m;
  }
  cout << f(N, M + K) << "\n";
  return 0;
}
