#include <bits/stdc++.h>
using namespace std;
void R(int &x) { scanf("%d", &x); }
void R(long long &x) { scanf("%lld", &x); }
void R(unsigned long long &x) { scanf("%llu", &x); }
void R(double &x) { scanf("%lf", &x); }
void R(long double &x) { scanf("%Lf", &x); }
template <typename T>
void R(T &t) {
  cin >> t;
}
template <typename T>
void R(vector<T> &ar) {
  for (auto &it : ar) R(it);
}
template <typename T, typename... Args>
void R(T &t, Args &...args) {
  R(t);
  R(args...);
}
void W(const char &c) { putchar(c); };
void W(const int &x) { printf("%d", x); }
void W(const long long &x) { printf("%lld", x); }
void W(const unsigned long long &x) { printf("%llu", x); }
void W(const double &x) { printf("%lf", x); }
void W(const long double &x) { printf("%Lf", x); }
template <typename T>
void W(const T &t) {
  cout << t;
}
template <typename T>
void W(const vector<T> &ar) {
  for (size_t i = 0; i < ar.size(); ++i) {
    W(ar[i]);
    putchar(" \n"[i + 1u == ar.size()]);
  }
}
template <typename T, typename... Args>
void W(const T &t, const Args &...args) {
  W(t);
  W(args...);
}
const int dx[] = {1, 0, -1, 0};
const int dy[] = {0, 1, 0, -1};
const int maxn = 1e6;
const long long mod = 1000000000 + 7;
long long pow_mod(long long a, long long p, const long long m) {
  long long ret = 1;
  for (; p; p >>= 1, a = a * a % m)
    if (p & 1) ret = ret * a % m;
  return ret % m;
}
long long inv(long long a, long long n) {
  return a < 2 ? a : ((1 - n * 1LL * inv(n % a, a)) / a % n + n) % n;
}
long long fac[maxn], rev[maxn];
long long f(long long t[3]) {
  long long r = fac[t[0] + t[1] + t[2]];
  for (int i = 0; i < int(3); ++i) r = r * rev[t[i]] % mod;
  return r;
}
long long buf[10000000], *ptr = buf;
long long *alloc(size_t n) {
  long long *ret = ptr;
  memset(ret, 0, sizeof(long long) * n);
  ptr += n;
  return ret;
}
void mul(int n, long long *a, long long *b, long long *c) {
  if (n < 16) {
    memset(c, 0, sizeof(long long) * (n + n - 1));
    for (int i = 0; i < int(n); ++i)
      for (int j = 0; j < int(n); ++j) {
        c[i + j] = (c[i + j] + a[i] * b[j]);
      }
    for (int i = 0; i < int(n * 2 - 1); ++i) c[i] %= mod;
    return;
  }
  int m = n >> 1, o = n - m;
  auto op = ptr;
  auto x = alloc(m * 2 - 1), y = alloc(o * 2 - 1), z = alloc(o * 2 - 1);
  auto aa = alloc(o), bb = alloc(o);
  for (int i = 0; i < int(m); ++i) {
    aa[i] = (a[i] + a[i + m]);
    if (aa[i] >= mod) aa[i] -= mod;
    bb[i] = (b[i] + b[i + m]);
    if (bb[i] >= mod) bb[i] -= mod;
  }
  mul(m, a, b, x);
  mul(o, a + m, b + m, y);
  mul(o, aa, bb, z);
  memcpy(c, x, sizeof(long long) * (m * 2 - 1));
  memcpy(c + m + m, y, sizeof(long long) * (o * 2 - 1));
  for (int i = 0; i < int(o * 2 - 1); ++i) {
    z[i] -= x[i] + y[i];
    if (z[i] < 0) z[i] += mod;
    if (z[i] < 0) z[i] += mod;
    c[i + m] += z[i];
    if (c[i + m] >= mod) c[i + m] -= mod;
  }
  ptr = op;
}
int n, m, k;
long long a[maxn] = {}, b[maxn] = {}, c[maxn] = {};
int main() {
  fac[0] = rev[0] = 1;
  for (int i = 1; i < maxn; ++i) {
    fac[i] = fac[i - 1] * i % mod;
    rev[i] = rev[i - 1] * inv(i, mod) % mod;
  }
  R(n, m, k);
  for (int i = (0); i <= int(m); ++i) a[i] = rev[i];
  for (int i = (0); i <= int(k); ++i) b[i] = rev[i];
  int sz = 2, mm = max(m, k) + 1;
  while (sz < mm) sz *= 2;
  mul(sz, a, b, c);
  long long ans = 0;
  for (int s = (0); s <= int(m + k); ++s) {
    long long t = fac[n + s - 1] * pow_mod(3, m + k - s, mod) % mod;
    t = t * rev[n - 1] % mod;
    t = t * c[s] % mod;
    ans = (ans + t) % mod;
  }
  cout << ans << endl;
  return 0;
}
