#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
const int N = 1e6 + 5;
const int mod = 1e9 + 7; 
using namespace std;

int n, m, k, fac[N], inv[N], ans, pw[N], f[N]; 

template < typename T >
inline T read()
{
	T x = 0, w = 1; char c = getchar();
	while(c < '0' || c > '9') { if(c == '-') w = -1; c = getchar(); }
	while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
	return x * w; 
}

int fpow(int x, int y)
{
	int res = 1;
	for( ; y; y >>= 1, x = 1ll * x * x % mod)
		if(y & 1) res = 1ll * res * x % mod;
	return res; 
}

int C(int n, int m)
{
	if(n < m || m < 0 || n < 0) return 0;
	return 1ll * fac[n] * inv[m] % mod * inv[n - m] % mod; 
}

int main()
{
#ifndef ONLINE_JUDGE
	freopen("cpp.in", "r", stdin);
#endif
	n = read <int> (), m = read <int> (), k = read <int> ();
	for(int i = (fac[0] = 1); i <= n + m + k; i++) fac[i] = 1ll * fac[i - 1] * i % mod; 
	inv[n + m + k] = fpow(fac[n + m + k], mod - 2);
	for(int i = n + m + k - 1; i >= 0; i--) inv[i] = 1ll * inv[i + 1] * (i + 1) % mod; 
	for(int i = (pw[0] = 1); i <= n + m + k; i++) pw[i] = 1ll * pw[i - 1] * 3 % mod; 
	for(int t = 0; t <= m + k; t++)
	{
		if(!t) f[t] = 1;
		else f[t] = 2ll * f[t - 1], f[t] = (1ll * f[t] - C(t - 1, t - 1 - k) - C(t - 1, m) + 2ll * mod) % mod;
		ans = (1ll * pw[m + k - t] * C(n + t - 1, n - 1) % mod * f[t] + ans) % mod; 
	}
	printf("%d\n", ans); 
	return 0; 
}
