//Night's template
//orzakyrt
#include <bits/stdc++.h>
#define R register
#define LL long long
#ifdef __DEBUG__
	#define Debug puts("orzyrt")
	#define debug(__a...) fprintf(stderr,__a);
#else
	#define Debug ('orzyrt')
	#define debug(__a...) ('orzyrt')
#endif
inline void Compile(R char *s){
	char com[11111];
	sprintf(com,"g++ %s.cpp -lm -o %s",s,s);
	system(com);
}
inline void setfile(R char *s){
	char inname[111],outname[111];
	sprintf(inname,"%s.in",s);
	sprintf(outname,"%s.out",s);
	freopen(inname,"r",stdin);
	freopen(outname,"w",stdout);
}
#ifdef __DEBUG__
	#define setfile(__a) (1)
#endif
template<class TT>inline TT Max(R TT a,R TT b){return a<b?b:a;}
template<class TT>inline TT Min(R TT a,R TT b){return a<b?a:b;}
template<class TT>inline TT Abs(R TT a){return a<0?-a:a;}
template<class TT>inline TT cmin(R TT &a,R TT b){(a>b)&&(a=b);}
template<class TT>inline TT cmax(R TT &a,R TT b){(a<b)&&(a=b);}
using namespace std;
template<class TT>inline void read(R TT &x){
	x=0;R bool f=false;R char c=getchar();
	for(;c<48||c>57;c=getchar())f|=(c=='-');
	for(;c>47&&c<58;c=getchar())x=(x<<1)+(x<<3)+(c^48);
	(f)&&(x=-x);
}
//end template

const int maxn = 1e6+10;
const int mod = 1e9+7;
inline LL qpow(R LL a,R LL b){
	R LL ret=1;a%=mod;
	for(;b;b>>=1){
		if(b&1)ret=ret*a%mod;
		a=a*a%mod;
	}
	return ret;
}
inline LL rev(R LL x){
	return qpow(x,mod-2);
}
int n,m,k;
LL f[maxn],rf[maxn],p3[maxn];
inline LL nCr(R int n,R int r){
	return f[n]*rf[r]%mod*rf[n-r]%mod;
}
int main(){
	read(n);read(m);read(k);
	for(R int i=*f=*rf=1;i<maxn;++i){
		f[i]=i*f[i-1]%mod;
		rf[i]=rev(f[i]);
	}
	*p3=1;
	for(R int i=1;i<maxn;++i){
		p3[i]=p3[i-1]*3%mod;
	}
	R LL ans=0;
	for(R int i=0;i<=m;++i){
		for(R int j=0;j<=k;++j){
			ans=(ans+nCr(n+i+j-1,n-1)*nCr(i+j,i)%mod*p3[m+k-i-j]%mod)%mod;
		}
	}
	printf("%lld\n",ans);
	return 0;
}