#include <bits/stdc++.h>
using namespace std;
template<class T> ostream& operator<<(ostream &os, vector<T> V) { os << "[ "; 
	for(auto v:V)os << v << " "; return os << "]";
}
template<class T> ostream& operator<<(ostream &os, set<T> S){ os << "{ "; 
	for(auto s:S) os<<s<<" ";  return os<<"}"; 
}
template<class L, class R> ostream& operator<<(ostream &os, pair<L,R> P) {
	return os<<"("<<P.first<<","<< P.second << ")";
}
template<class L, class R> ostream& operator<<(ostream &os, map<L,R> M) {
	os<<"{ ";for(auto m:M)os<<"("<<m.F<<":"<<m.S<<")";
	return os<<"}";
}
#define cerr cout
#define TRACE
#ifdef TRACE
#define trace(...) __f(#__VA_ARGS__, __VA_ARGS__)
template <typename Arg1>
void __f(const char* name, Arg1&& arg1){
	cerr << name << " : " << arg1 << std::endl;
}
template <typename Arg1, typename... Args>
void __f(const char* names, Arg1&& arg1, Args&&... args){
	const char* comma = strchr(names + 1, ',');cerr.write(names, comma - names) << " : " << arg1<<" | ";__f(comma+1, args...);
}
#else
#define trace(...) 1
#endif
#define ll long long
#define ld long double
#define vll vector<ll>
#define pll pair<ll,ll>
#define vpll vector<pll>
#define I insert 
#define pb push_back
#define F first
#define S second
#define endl "\n"
#define mp make_pair
#define all(v) (v).begin(),(v).end()
#define For(i,n) for(int i=0;i<(int)n;++i)
#define Rev(i,n) for(int i=(int)n-1;i>=0;--i)
#define Rep(i,n) for(int i=1;i<=(int)n;++i)
typedef vector<int> vi;
typedef pair<int,int> pii;
typedef pair<pii,int> ppi;
typedef vector<pii> vpii;
#define fio ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL)

const int N = 1e6 + 100;
const int mod = 1e9 + 7;

inline int mul(int a , int b){
	return a*1ll*b%mod;
}
inline int mul(int a , int b, int c){
	return mul(a , mul(b , c));
}
inline int sub(int a , int b){
	a -= b;
	if(a < 0) a += mod;
	return a;
}
inline int add(int a , int b){
	a += b;
	if(a >= mod) a -= mod;
	return a;
}
inline int power(int x, int y){
	int res = 1;
	while(y){
		if(y&1)
			res = mul(res , x);
		x = mul(x , x);
		y >>= 1;
	}
	return res;
}

int fac[N] , inv[N];
int pr[N];
int pr2[N];
int dp[N];
int dp2[N];
int nCr(int n , int r){
	if(r < 0 || r > n) return 0;
	return mul(fac[n] , mul(inv[r] , inv[n-r]));
}

int main(){
	fio; cout<<fixed<<setprecision(25);	
	fac[0] = 1;
	pr[0] = 1;
	pr2[0] = 1;
	for(int i = 1;i< N ; ++i){
		pr[i] = mul(pr[i-1] , 3);
		pr2[i] = mul(pr2[i-1] , 2);
		fac[i] = mul(fac[i-1] , i);
	}
	inv[N-1] = power(fac[N-1] , mod-2);
	for(int i = N-2 ; i >= 0 ; --i){
		inv[i] = mul(inv[i+1] , i+1);
	}
	assert(inv[0] == 1);
	int n , m , k; cin >> n >> m >> k;
	if(m > k) swap(m , k);
	int ans = 0;

	// for(int i = 0;i <= m ; ++i){
	// 	for(int j = 0;j <= k ; ++j){
	// 		ans = add(ans , mul( mul(mul( 1 , 1)  , mul(nCr(n-1+i+j , n-1) , nCr(i+j , i) )) , pr[m-i+k-j]  ) );
	// 		// trace(i , j , ans);
	// 	}
	// }
	// trace(ans);
	ans = 0;
	int l = 0 , r = k;
	for(int i = 0 ;i <= m+k ; ++i){


		if(i == 0){
			dp[i] = 1;
		}
		else{
			l = i-m;
			dp[i] =  sub( mul(2 , dp[i-1]) , add(nCr(i-1 , l-1) , nCr(i-1 , r)) );
		}
		// trace(i , dp[i]);
		ans = add(ans , mul(nCr(n-1+i , i) ,  dp[i] , pr[m+k-i]));
	}
	cout << ans << endl;





	return 0;
}


Measured memory_bytes: 21632