#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <cmath>
#include <ctime>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <bitset>
#include <vector>
#include <complex>
#include <algorithm>
using namespace std;
typedef long long ll;
typedef double db;
typedef pair<int,int> pii;
typedef vector<int> vi;
#define de(x) cout << #x << "=" << x << endl
#define rep(i,a,b) for(int i=a;i<(b);++i)
#define all(x) (x).begin(),(x).end()
#define sz(x) (int)(x).size()
#define mp make_pair
#define pb push_back
#define fi first
#define se second
const int P = 1e9 + 7 , N = 9 * 1e5 + 10;
int Pow(int x,int t){int r=1;for(;t;t>>=1,x=1ll*x*x%P)if(t&1)r=1ll*r*x%P;return r;}
int a , b , c , f[N] = {1}, rf[N] , p2[N] , p3[N];

int C(int n,int m){
    return 1ll * f[n] * rf[m] % P * rf[n - m] % P;
}
void pp(int &x,int d){
    x += d;
    if(x >= P) x -= P;
}

int main(){
    rep(i,1,N) f[i] = 1ll * f[i-1] * i % P;
    p2[0] = p3[0] = 1;
    rep(i,1,N) p2[i] = 1ll * p2[i-1] * 2 % P , p3[i] = 1ll * p3[i-1] * 3 % P;
    rf[N-1] = Pow(f[N-1] , P - 2);
    for(int i=N-2;i>=0;--i) rf[i] = rf[i+1] * 1ll * (i + 1) % P;
    scanf("%d%d%d",&a,&b,&c);
    ++b;++c;
    int n = a + b + c;
    int ans = 0 , c1 = 0 , c2 = 0;
    for(int i=a;i+2<=n;++i){
        int tmp = C(i - 1 , a - 1) , all = p2[i-a];
        if(b == i-a) c1 = 1;
        if(c == i-a) c2 = 1;
        if(b < i-a) c1 = 1ll * c1 * 2 % P , pp(c1 , C(i - a - 1, i - a - b));
        if(c < i-a) c2 = 1ll * c2 * 2 % P , pp(c2 , C(i - a - 1, i - a - c));
        pp(all , P - c1);
        pp(all , P - c2);
        pp(ans , 1ll * tmp * all % P * p3[n-i-2] % P);
    }
    printf("%d\n",ans);
    return 0;
}
