#include <bits/stdc++.h>
using namespace std;
template <class T>
void debug(T a, T b) {
  for (; a != b; ++a) cerr << *a << ' ';
  cerr << endl;
}
template <class T>
void chmin(T& a, const T& b) {
  if (a > b) a = b;
}
template <class T>
void chmax(T& a, const T& b) {
  if (a < b) a = b;
}
namespace std {
template <class S, class T>
ostream& operator<<(ostream& out, const pair<S, T>& a) {
  out << '(' << a.first << ',' << a.second << ')';
  return out;
}
}  // namespace std
template <long long int mod>
struct Int_ {
  unsigned x;
  unsigned mpow(Int_ a, unsigned k) {
    Int_ res = 1;
    while (k) {
      if (k & 1) res = res * a;
      a = a * a;
      k >>= 1;
    }
    return res.x;
  }
  unsigned inverse(Int_ a) { return mpow(a, mod - 2); }
  Int_() : x(0) {}
  Int_(long long sig) {
    int sigt = sig % mod;
    if (sigt < 0) sigt += mod;
    x = sigt;
  }
  unsigned get() const { return (unsigned)x; }
  Int_& operator+=(Int_ that) {
    if ((x += that.x) >= mod) x -= mod;
    return *this;
  }
  Int_& operator-=(Int_ that) {
    if ((x += mod - that.x) >= mod) x -= mod;
    return *this;
  }
  Int_& operator*=(Int_ that) {
    x = (unsigned long long)x * that.x % mod;
    return *this;
  }
  Int_& operator=(Int_ that) {
    x = that.x;
    return *this;
  }
  Int_& operator/=(Int_ that) {
    x = (unsigned long long)x * inverse(that.x) % mod;
    return *this;
  }
  bool operator==(Int_ that) const { return x == that.x; }
  bool operator!=(Int_ that) const { return x != that.x; }
  Int_ operator-() const { return Int_(0) - Int_(*this); }
  Int_ operator+(Int_ that) const { return Int_(*this) += that; }
  Int_ operator-(Int_ that) const { return Int_(*this) -= that; }
  Int_ operator*(Int_ that) const { return Int_(*this) *= that; }
  Int_ operator/(Int_ that) const { return Int_(*this) /= that; }
};
namespace std {
template <long long int mod>
ostream& operator<<(ostream& out, const Int_<mod>& a) {
  out << a.get();
  return out;
}
template <long long int mod>
istream& operator>>(istream& in, Int_<mod>& a) {
  in >> a.x;
  return in;
}
};  // namespace std
int n, m, k;
Int_<1000000007> fact[600005], inv[600005];
Int_<1000000007> pw2[600005], pw3[600005];
Int_<1000000007> C(int a, int b) {
  if (a < 0 || b < 0 || b > a) return 0;
  return fact[a] * inv[b] * inv[a - b];
}
int main() {
  fact[0] = 1;
  pw2[0] = pw3[0] = 1;
  for (int i = 0; i < (600004); ++i)
    fact[i + 1] = fact[i] * (i + 1), pw2[i + 1] = pw2[i] * 2,
             pw3[i + 1] = pw3[i] * 3;
  ;
  Int_<1000000007> one = 1;
  inv[600000] = one / fact[600000];
  for (int i = 599999; i >= 0; --i) inv[i] = inv[i + 1] * (i + 1);
  cin >> n >> m >> k;
  Int_<1000000007> res = 0;
  Int_<1000000007> sum1 = 0, sum2 = 0;
  for (int i = n; i <= n + m + k; ++i) {
    Int_<1000000007> tmp = C(i, n) - C(i - 1, n);
    sum1 = sum1 * 2 + C(i - n - 1, i - n - m - 1);
    sum2 = sum2 * 2 + C(i - n - 1, i - n - k - 1);
    tmp *= pw2[i - n] - sum1 - sum2;
    tmp *= pw3[n + m + k - i];
    res += tmp;
  }
  cout << res << endl;
  return 0;
}
