#include <bits/stdc++.h>
#include <boost/range/algorithm.hpp>
#include <boost/range/numeric.hpp>
#include <boost/range/irange.hpp>
#include <boost/range/adaptor/indexed.hpp>

using namespace std;
using namespace boost::adaptors;
using namespace std::string_literals;
using ll = int64_t;
using vecint = vector<int>;
using vecll = vector<ll>;
using boost::irange;
constexpr ll MOD = 1000000007;

// a^-1 mod p
ll inv(ll a,ll p){
  return ( a == 1 ? 1 : (1 - p*inv(p%a,a)) / a + p );
}

ll pow3(ll x) {
  if (x == 0) return 1;
  if ((x%2)==1) return 3*pow3(x-1)%MOD;
  ll h=pow3(x/2);
  return h*h%MOD;
}

int main()
{
  ll n,m,k;
  cin>>n>>m>>k;
  vecll fact(3001);
  vecll factinv(3001);
  fact[0] = 1;
  factinv[0] = 1;
  for(int i:irange(0,3000)) {
    fact[i+1] = fact[i] * (i+1) % MOD;
    factinv[i+1] = inv(fact[i+1], MOD);
  }
  ll ans = 0;
  ll l=n+m+k;
  for(ll i:irange(n,l+1)) {
    ll r = i-n;
    ll comb = fact[i-1] * factinv[n-1] % MOD;
    comb = comb * factinv[r] % MOD;
    ll pw = pow3(l-i);
    ll mn = max(0l,min(i-n-k, m));
    for (ll j:irange(mn, min(r+1,m+1))) {
      ll comb2 = fact[r] * factinv[j] % MOD;
      comb2 = comb2 * factinv[r-j] % MOD;
      ll mul = comb * comb2 % MOD;
      mul = mul * pw % MOD;
      ans += mul;
      ans %= MOD;
    }
  }
  cout<<ans<<endl;
  return 0;
}
