#include <bits/stdc++.h>
using namespace std;
const int inf = int(1e9);
const long long linf = long long(1e18);
const double eps = 1e-9;
const double pi = 4 * atan(1.0);
const int MOD = int(1e9) + 7;
const int P = 500;
const int N = int(4e6);
const int K = 4;
struct base {
  double a, b;
  base() : a(0), b(0) {}
  base(double a, double b = 0) : a(a), b(b) {}
};
inline base operator+(const base& a, const base& b) {
  return base(a.a + b.a, a.b + b.b);
}
inline base operator-(const base& a, const base& b) {
  return base(a.a - b.a, a.b - b.b);
}
inline base operator*(const base& a, const base& b) {
  return base(a.a * b.a - a.b * b.b, a.a * b.b + a.b * b.a);
}
inline base operator/(const base& a, double b) {
  return base(a.a / b, a.b / b);
}
int maxv;
int a[K][N], b[K][N], ab[K * 2][N];
int f[N], rf[N];
base aa[N];
inline int calc(int a, int b) {
  int res = 1;
  while (b > 0) {
    if (b % 2 != 0) {
      res = (1LL * res * a) % MOD;
    }
    a = (1LL * a * a) % MOD;
    b /= 2;
  }
  return res;
}
inline void fft(base* a, int n, bool fl) {
  for (int i = 1, j = 0; i < n; ++i) {
    int bit = n / 2;
    for (; j >= bit; bit /= 2) {
      j -= bit;
    }
    j += bit;
    if (i < j) {
      swap(a[i], a[j]);
    }
  }
  for (int len = 2; len <= n; len *= 2) {
    double ang = 2 * pi / len * (fl ? -1 : 1);
    base wlen(cos(ang), sin(ang));
    for (int i = 0; i < n; i += len) {
      base w(1);
      for (int j = 0; j < len / 2; ++j) {
        base u = a[i + j], v = a[i + j + len / 2] * w;
        a[i + j] = u + v;
        a[i + j + len / 2] = u - v;
        w = w * wlen;
      }
    }
  }
  if (fl) {
    for (int i = 0; i < n; ++i) {
      a[i] = a[i] / n;
    }
  }
}
inline void mult(int* a, int* b, int* c) {
  for (int i = 0; i < maxv; ++i) {
    aa[i].a = a[i];
    aa[i].b = b[i];
  }
  fft(aa, maxv, false);
  for (int i = 0; i < maxv; ++i) {
    aa[i] = aa[i] * aa[i];
  }
  fft(aa, maxv, true);
  for (int i = 0; i < maxv; ++i) {
    c[i] = (c[i] + long long(aa[i].b + 0.5) / 2) % MOD;
  }
}
int main() {
  int n, m, k;
  cin >> n >> m >> k;
  f[0] = 1;
  for (int i = 1; i <= n + m + k; ++i) {
    f[i] = (1LL * f[i - 1] * i) % MOD;
  }
  rf[n + m + k] = calc(f[n + m + k], MOD - 2);
  for (int i = n + m + k - 1; i >= 0; --i) {
    rf[i] = (1LL * rf[i + 1] * (i + 1)) % MOD;
  }
  for (int i = 0; i <= m; ++i) {
    int cur = rf[i];
    for (int j = 0; j < K; ++j) {
      a[j][i] = cur % P;
      cur /= P;
    }
    assert(cur == 0);
  }
  for (int i = 0; i <= k; ++i) {
    int cur = rf[i];
    for (int j = 0; j < K; ++j) {
      b[j][i] = cur % P;
      cur /= P;
    }
    assert(cur == 0);
  }
  maxv = 1;
  while (maxv < max(m, k) + 1) {
    maxv *= 2;
  }
  maxv *= 2;
  assert(maxv < N);
  for (int i = 0; i < K; ++i) {
    for (int j = 0; j < K; ++j) {
      mult(a[i], b[j], ab[i + j]);
    }
  }
  int ans = 0, pw3 = 1, inv3 = calc(3, MOD - 2);
  for (int i = 0; i <= m + k; ++i) {
    int sum = 0;
    for (int j = 2 * K - 1; j >= 0; --j) {
      sum = (1LL * sum * P + ab[j][i]) % MOD;
    }
    sum = (1LL * sum * pw3) % MOD;
    sum = (1LL * sum * f[n - 1 + i]) % MOD;
    ans += sum;
    if (ans >= MOD) {
      ans -= MOD;
    }
    pw3 = (1LL * inv3 * pw3) % MOD;
  }
  ans = (1LL * ans * calc(3, m + k)) % MOD;
  ans = (1LL * ans * rf[n - 1]) % MOD;
  cout << ans << endl;
  return 0;
}
