#include <bits/stdc++.h>
using namespace std;
const int mod = (int)1e9 + 7;
const int root = 646;
const int root_1 = 208611436;
const int root_pw = 1 << 20;
int mult(int a, int b) { return (1LL * a * b) % mod; }
int pw(int a, int b) {
  if (b == 0) return 1;
  if (b & 1) return mult(a, pw(a, b - 1));
  int res = pw(a, b / 2);
  return mult(res, res);
}
int sub(int a, int b) {
  int s = a - b;
  if (s < 0) s += mod;
  return s;
}
int sum(int a, int b) {
  int s = a + b;
  if (s >= mod) s -= mod;
  return s;
}
const int maxN = 3 * (int)1e5 + 100;
int fact[maxN], invfact[maxN], inv[maxN];
int pw3[maxN];
void init() {
  inv[1] = invfact[1] = invfact[0] = fact[0] = fact[1] = 1;
  for (int i = 2; i < maxN; i++) {
    fact[i] = mult(fact[i - 1], i);
    inv[i] = mult(inv[mod % i], mod - mod / i);
    invfact[i] = mult(invfact[i - 1], inv[i]);
  }
  pw3[0] = 1;
  for (int i = 1; i < maxN; i++) {
    pw3[i] = mult(pw3[i - 1], 3);
  }
}
int cnk(int n, int k) {
  if (n < k) return 0;
  if (n < 0 || k < 0) return 0;
  return mult(fact[n], mult(invfact[k], invfact[n - k]));
}
int invNumber(int a) { return pw(a, mod - 2); }
struct query {
  int L, R, coef;
  query(int _L, int _R, int _coef) : L(_L), R(_R), coef(_coef) {}
};
const int BLOCK = 500;
bool cmp(query& a, query& b) {
  return make_pair(a.L / BLOCK, a.R) < make_pair(b.L / BLOCK, b.R);
}
int L, R, res;
void incL() {
  L++;
  res = sum(res, cnk(R, L));
}
void decL() {
  res = sub(res, cnk(R, L));
  L--;
}
void incR() {
  res = sum(res, res);
  res = sub(res, cnk(R, L));
  R++;
}
const int inv2 = (mod + 1) / 2;
void decR() {
  R--;
  res = sum(res, cnk(R, L));
  res = mult(res, inv2);
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr);
  init();
  int n, m, k;
  cin >> n >> m >> k;
  int tot = n + m + k;
  vector<query> all;
  for (int where = n; where <= tot; where++) {
    int cur = cnk(where - 1, n - 1);
    cur = mult(cur, pw3[tot - where]);
    int from = where - n - k;
    int to = m;
    to = min(to, where - n);
    from = max(from, 0);
    if (from > to) continue;
    all.emplace_back(to, where - n, cur);
    if (from) all.emplace_back(from - 1, where - n, sub(0, cur));
  }
  sort(all.begin(), all.end(), cmp);
  L = 0;
  R = 0;
  res = 1;
  int ans = 0;
  for (auto it : all) {
    while (R < it.R) incR();
    while (L > it.L) decL();
    while (R > it.R) decR();
    while (L < it.L) incL();
    ans = sum(ans, mult(it.coef, res));
  }
  cout << ans;
  return 0;
}
