#include <stdio.h>
#include <algorithm>
#include <iostream>
#include <vector>
#include <map>
#include <set>
#include <math.h>
#include <string.h>
#include <string>
#include <queue>
#include <stack>
using namespace std;
typedef long long int ll;
ll mod=1e9+7;
ll powt[1000100];
ll powtwo[1000100];
ll fact[1000100];
ll inv[1000100];
ll invfact[1000100];
ll dp[1000100];
ll ans;
int n, m, l;

ll com(int u, int v)
{
	ll ret=1;
	ret=(ret*fact[u])%mod;
	ret=(ret*invfact[v])%mod;
	ret=(ret*invfact[u-v])%mod;
	return ret;
}

int main(void)
{
	cin>>n>>m>>l;
	n++;
	inv[1]=1;
	invfact[0]=1;
	fact[0]=1;
	invfact[1]=1;
	fact[1]=1;
	int i, j, k;
	for(i=2 ; i<=1000000 ; i++)
	{
		inv[i]=((mod-mod/i)*inv[mod%i])%mod;
		fact[i]=(i*fact[i-1])%mod;
		invfact[i]=(invfact[i-1]*inv[i])%mod;
	}
	powt[0]=1;
	powt[1]=3;
	powtwo[0]=1;
	powtwo[1]=2;
	for(i=2 ; i<=1000000 ; i++)
	{
		powt[i]=(3*powt[i-1])%mod;
		powtwo[i]=(2*powtwo[i-1])%mod;
	}
	if(l<m)
	{
		ll temp=l;
		l=m;
		m=temp;
	}
	ll sp=0;
	for(k=0 ; k<=m+l ; k++)
	{
		ll x=powtwo[k];
		sp=(2*sp)%mod;
		if(k>m)
		{
			sp=(sp+com(k-1,k-m-1))%mod;
		}
		if(k>l)
		{
			sp=(sp+com(k-1,k-l-1))%mod;
		}
		x=(x-sp)%mod;
		ll add=1;
		add=(add*x)%mod;
		add=(add*powt[m+l-k])%mod;
		add=(add*com(n+k-2,k))%mod;
		ans=(ans+add)%mod;
	}
	cout<<(ans+mod)%mod;
}