//整数列a[i],b[i]から列c[k]=sum{a[i]*b[k-i]}を生成する.任意modに対応.O(NlogN).
//NTT_CONVOLUTION_TIME を適切に変更するのを忘れない
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
#include <string>
#include <math.h>
#include <iomanip>
#include <limits>
#include <list>
#include <queue>
#include <tuple>
#include <map>
#include <stack>
#include <set>
#include <complex>
using namespace std;
#define MOD (long long int)(1e9+7)
#define ll long long int
#define rep(i,n) for(int i=0; i<(int)(n); i++)
#define reps(i,n) for(int i=1; i<=(int)(n); i++)
#define REP(i,n) for(int i=n-1; i>=0; i--)
#define REPS(i,n) for(int i=n; i>0; i--)
#define INF (int)(1123456789)
#define LINF (long long int)(112345678901234567)
#define chmax(a, b) a = (((a)<(b)) ? (b) : (a))
#define chmin(a, b) a = (((a)>(b)) ? (b) : (a))
#define all(v) v.begin(), v.end()

std::vector<int> tmp;
size_t sz = 1;

ll mpow(ll a, ll b){
  if(b==0) return 1;
  else if(b%2==0){ll memo = mpow(a,b/2); return memo*memo%MOD;}
  else return mpow(a,b-1) * a % MOD;
}
ll lpow(ll a, ll b){
  if(b==0) return 1;
  else if(b%2==0){ll memo = lpow(a,b/2); return memo*memo;}
  else return lpow(a,b-1) * a;
}
ll gcd(ll a, ll b){
  if(b==0) return a;
  else return gcd(b, a%b);
}
vector<ll> kaijo_memo;
ll kaijo(ll n){
  if(kaijo_memo.size() > n) return kaijo_memo[n];
  if(kaijo_memo.size() == 0) kaijo_memo.push_back(1);
  while(kaijo_memo.size() <= n) kaijo_memo.push_back(kaijo_memo[kaijo_memo.size()-1] * kaijo_memo.size() % MOD);
  return kaijo_memo[n];
}
vector<ll> gyaku_kaijo_memo;
ll gyaku_kaijo(ll n){
  if(gyaku_kaijo_memo.size() > n) return gyaku_kaijo_memo[n];
  if(gyaku_kaijo_memo.size() == 0) gyaku_kaijo_memo.push_back(1);
  while(gyaku_kaijo_memo.size() <= n) gyaku_kaijo_memo.push_back(gyaku_kaijo_memo[gyaku_kaijo_memo.size()-1] * mpow(gyaku_kaijo_memo.size(), MOD-2) % MOD);
  return gyaku_kaijo_memo[n];
}

ll nCr(ll n, ll r){
  if(n == r) return 1;//0個の丸と-1個の棒みたいな時に時に効く？不安.
  if(n < r || r < 0) return 0;
  ll ret = 1;
  ret *= kaijo(n); ret %= MOD;
  ret *= gyaku_kaijo(r); ret %= MOD;
  ret *= gyaku_kaijo(n-r); ret %= MOD;
  return ret;
}

inline int powMod(int n, int p, int m) {
    int res = 1;
    while (p) {
        if (p & 1) res = (ll)res * n % m;
        n = (ll)n * n % m;
        p >>= 1;
    }
    return (int)res;
}
inline int invMod(int n, int m) {
    return powMod(n, m - 2, m);
}

template <int Mod, int PrimitiveRoot>
struct NTTPart {
    static std::vector<int> ntt(std::vector<int> a, bool inv = false) {
        size_t mask = sz - 1;
        size_t p = 0;
        for (size_t i = sz >> 1; i >= 1; i >>= 1) {
            auto& cur = (p & 1) ? tmp : a;
            auto& nex = (p & 1) ? a : tmp;
            int e = powMod(PrimitiveRoot, (Mod - 1) / sz * i, Mod);
            if (inv) e = invMod(e, Mod);
            int w = 1;
            for (size_t j = 0; j < sz; j += i) {
                for (size_t k = 0; k < i; ++k) {
                    nex[j + k] = (cur[((j << 1) & mask) + k] + (ll)w * cur[(((j << 1) + i) & mask) + k]) % Mod;
                }
                w = (ll)w * e % Mod;
            }
            ++p;
        }
        if (p & 1) std::swap(a, tmp);
        if (inv) {
            int invSz = invMod(sz, Mod);
            for (size_t i = 0; i < sz; ++i) a[i] = (ll)a[i] * invSz % Mod;
        }
        return a;
    }
    static std::vector<int> mul(std::vector<int> a, std::vector<int> b) {
        a = ntt(a);
        b = ntt(b);
        for (size_t i = 0; i < sz; ++i) a[i] = (ll)a[i] * b[i] % Mod;
        a = ntt(a, true);
        return a;
    }
};

constexpr int M[] = {1224736769, 469762049, 167772161};
constexpr int PR[] = {3, 3, 3};
constexpr int NTT_CONVOLUTION_TIME = 3;
/*
    X := max(a)*max(b)*min(|a|, |b|) のとき,
    NTT_CONVOLUTION_TIME <- 1: X <         1224736769 = 1.2*10^ 9 ~ 2^30
    NTT_CONVOLUTION_TIME <- 2: X < 575334854091079681 = 5.8*10^17 ~ 2^59
    NTT_CONVOLUTION_TIME <- 3: X < 2^86 (32bit * 32bit * 10^7くらいまで)
*/

inline void garner(std::vector<int> *c, int mod) {
    if (NTT_CONVOLUTION_TIME == 1) {
        for(auto& x : c[0]) x %= mod;
    }
    else if (NTT_CONVOLUTION_TIME == 2) {
        const int r01 = invMod(M[0], M[1]);
        for (size_t i = 0; i < sz; ++i) {
            c[1][i] = (c[1][i] - c[0][i]) * (ll)r01 % M[1];
            if (c[1][i] < 0) c[1][i] += M[1];
            c[0][i] = (c[0][i] + (ll)c[1][i] * M[0]) % mod;
        }
    }
    else if (NTT_CONVOLUTION_TIME == 3) {
        const int R01 = invMod(M[0], M[1]);
        const int R02 = invMod(M[0], M[2]);
        const int R12 = invMod(M[1], M[2]);
        const int M01 = (ll)M[0] * M[1] % mod;
        for (size_t i = 0; i < sz; ++i) {
            c[1][i] = (c[1][i] - c[0][i]) * (ll)R01 % M[1];
            if (c[1][i] < 0) c[1][i] += M[1];
            c[2][i] = ((c[2][i] - c[0][i]) * (ll)R02 % M[2] - c[1][i]) * R12 % M[2];
            if (c[2][i] < 0) c[2][i] += M[2];
            c[0][i] = (c[0][i] + (ll)c[1][i] * M[0] + (ll)c[2][i] * M01) % mod;
        }
    }
}
std::vector<int> mul(std::vector<int> a, std::vector<int> b, int mod) {
    for (auto& x : a) x %= mod;
    for (auto& x : b) x %= mod;

    size_t m = a.size() + b.size() - 1;
    sz = 1;
    while (m > sz) sz <<= 1;
    tmp.resize(sz);
    a.resize(sz, 0);
    b.resize(sz, 0);

    std::vector<int> c[NTT_CONVOLUTION_TIME];
    if (NTT_CONVOLUTION_TIME >= 1) c[0] = NTTPart<M[0], PR[0]>::mul(a, b);
    if (NTT_CONVOLUTION_TIME >= 2) c[1] = NTTPart<M[1], PR[1]>::mul(a, b);
    if (NTT_CONVOLUTION_TIME >= 3) c[2] = NTTPart<M[2], PR[2]>::mul(a, b);
    for (auto& v : c) v.resize(m);
    garner(c, mod);
    return c[0];
}

int main(void){
    ll n,m,k;
    cin>>n>>m>>k;
    vector<int> X,B,C;
    rep(i,m+1){
      B.push_back(gyaku_kaijo(i));
    }
    rep(i,k+1){
      C.push_back(gyaku_kaijo(i));
    }
    //多項式の係数配列C = 多項式の係数配列A * 多項式の係数配列B
    //NTT_CONVOLUTION_TIMEを変更するのを忘れない
    X = mul(B,C,MOD);
    //bとc合わせてX回出たバターンの網羅
    ll ans = 0;
    rep(x,X.size()){
      ans += kaijo(n-1+x) * gyaku_kaijo(n-1) %MOD * X[x] %MOD * mpow(3,n+m+k-n-x) %MOD;
      ans %= MOD;
    }
    cout<<ans<<endl;
    return 0;
}

Measured memory_bytes: 40544