#include<vector>
#include<cmath>
#include<map>
#include<cstdlib>
#include<iostream>
#include<sstream>
#include<fstream>
#include<string>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<set>
#include<stack>
#include<bitset>
#include<functional>
#include<ctime>
#include<queue>
#include<deque>
#include<complex>
using namespace std;
#define pb push_back
#define pf push_front
typedef long long lint;
typedef complex<double> P;
#define mp make_pair
#define fi first
#define se second
typedef pair<int,int> pint;
#define All(s) s.begin(),s.end()
#define rAll(s) s.rbegin(),s.rend()
#define REP(i,a,b) for(int i=a;i<b;i++)
#define rep(i,n) REP(i,0,n)
vector<lint> zyo,rz,z3;
lint mo=1000000007;
lint dp[810893];
lint extgcd(lint a, lint b, lint &x, lint &y) {
  lint g = a; x = 1; y = 0;
  if (b != 0) g = extgcd(b, a % b, y, x), y -= (a / b) * x;
  return g;
}
lint invMod(lint a, lint m) {
  lint x, y;
  if (extgcd(a, m, x, y) == 1) return (x + m) % m;return 0;
}
lint cal(int a,int b){
	return ((zyo[a+b]*rz[a])%mo*rz[b])%mo;
}
int main()
{
	int n,m,k;lint out=0;
	cin>>n>>m>>k;
	zyo.pb(1);rep(i,931931) zyo.pb((zyo[i]*(i+1))%mo);
	rep(i,931931) rz.pb(invMod(zyo[i],mo));
	z3.pb(1);rep(i,810893) z3.pb((z3[i]*3)%mo);
	dp[0]=1;
	rep(i,m+k){
		dp[i+1]=dp[i]*2;
		if(i>=m) dp[i+1]-=cal(m,i-m);
		if(i>=k) dp[i+1]-=cal(k,i-k);
		dp[i+1]%=mo;if(dp[i+1]<0) dp[i+1]+=mo;
	}
	rep(i,m+k+1){
		//cout<<i<<' '<<dp[i]<<' '<<cal(i,n-1)<<' '<<z3[m+k-i]<<endl;
		out+=(dp[i]*cal(i,n-1))%mo*z3[m+k-i];
		out%=mo;
	}
	cout<<out%mo<<endl;
}
