#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<iostream>
#define db double
#define LL long long
#define inf 0x3f3f3f3f
using namespace std;
int gi()
{
    int res=0,s=1; char ch;
    for(ch=getchar();(ch<'0'||ch>'9')&&ch!='-';ch=getchar());
    if(ch=='-') s=-1,ch=getchar();
    for(;ch>='0'&&ch<='9';ch=getchar()) res=res*10+ch-48;
    return res*s;
}

const int mo=1000000007,maxn=900000;
LL jc[1000005],ny[1000005],ans,ways[1000005];
int n,m,k;

LL qp(LL x,LL y) {
    LL res=1;
    for(;y;y>>=1,x=x*x%mo)
	if(y&1) res=res*x%mo;
    return res;
}
LL C(int x,int y) {return x>=y&&y>=0 ? 1ll*jc[x]*ny[y]%mo*ny[x-y]%mo : 0;}

int main()
{
    n=gi(),m=gi(),k=gi();
    for(int i=0;i<=maxn;++i) jc[i]=i?jc[i-1]*i%mo:1;
    for(int i=maxn;i>=0;--i) ny[i]=i==maxn?qp(jc[i],mo-2):ny[i+1]*(i+1)%mo;
    
    if(m>k) swap(m,k);   //m<=k
    for(int i=0;i<=m;++i) ways[i]=qp(2,i);
    for(int i=m+1;i<=k;++i) ways[i]=(2*ways[i-1]%mo-C(i-1,m)+mo)%mo;
    for(int i=k+1;i<=m+k;++i) ways[i]=(2*ways[i-1]%mo-C(i-1,m)-C(i-1,i-1-k)+mo+mo)%mo;
    
    for(int all=n;all<=n+m+k;++all) {
	ans+=C(all-1,n-1)*qp(3,n+m+k-all)%mo*ways[all-n]%mo;
	ans>=mo?ans-=mo:0;
    }
    printf("%lld\n",ans);
    return 0;
}
