#include<cstdio>
#include<iostream>
#define f(i,a,b) for(register int i=(a),i##end=(b);i<=i##end;i=-(~i))
#define rf(i,a,b) for(register int i=(a),i##end=(b);i>=i##end;i=~(-i))
const int mod=1e9+7,neko=300010;
int ans,now,res,n,m,k;
typedef int arr[neko*3];
arr fac,ifac,pow3;
int spow(int m,int n)
{
	int b=1;
	for(;n;n>>=1,m=1ll*m*m%mod)if(n&1)b=1ll*b*m%mod;
	return b;
}
int C(int n,int m)
{return 1ll*fac[n]*ifac[m]%mod*ifac[n-m]%mod;}
void initM(int n)
{
	fac[0]=ifac[0]=pow3[0]=1;
	f(i,1,n)fac[i]=1ll*fac[i-1]*i%mod,pow3[i]=3ll*pow3[i-1]%mod;
	ifac[n]=spow(fac[n],mod-2);
	rf(i,n-1,1)ifac[i]=1ll*ifac[i+1]*(i+1)%mod;
}
int ADD(int x,int y){return (x+=y)>=mod?x-mod:x;}
int main()
{
	scanf("%d%d%d",&n,&m,&k);
	if(m<k)std::swap(m,k);
	initM(n+m+k+5),res=1;
	f(i,0,m+k)
	{
		now=1ll*C(n-1+i,i)*pow3[m+k-i]%mod*res%mod;
		if(i+1<=k)res=2ll*res%mod;
		else if(i+1<=m)res=ADD(2ll*res%mod,mod-C(i,k));
		else res=ADD(2ll*res%mod,ADD(mod-C(i,k),mod-C(i,m))); 
		ans=ADD(ans,now%mod);
	}printf("%d\n",ADD(ans,mod));
	return 0;
}
