#include <bits/stdc++.h>

#define rep(i, x, y) for (int i = (x), _ = (y); i <= _; ++i)
#define down(i, x, y) for (int i = (x), _ = (y); i >= _; --i)
#define x first
#define y second

using namespace std;
typedef long long LL;

template<typename T> inline void upmax(T & x, T y) { x < y ? x = y : 0; }
template<typename T> inline void upmin(T & x, T y) { x > y ? x = y : 0; }

template<typename T>
inline void read(T & x)
{
	char c;
	while ((c = getchar()) < '0' || c > '9');
	for (x = c - '0'; (c = getchar()) >= '0' && c <= '9'; x = x * 10 + c - '0');
}

const int mo = 1e9 + 7;
const int N = 9e5 + 10;

int pow_2[N], pow_3[N];
int fac[N], inv[N];
int X, Y, Z, n;

inline int qpow(int x, int n)
{
	int ans = 1;
	while (n)
	{
		if (n & 1)
			ans = (LL) ans * x % mo;
		x = (LL) x * x % mo;
		n >>= 1;
	}
	return ans;
}

inline int C(int n, int m)
{
	if (n < m)
		return 0;
	return (LL) fac[n] * inv[m] % mo * inv[n - m] % mo;
}

inline void upd(int & x, int y)
{
	(x += y) >= mo ? x -= mo : 0;
}

int main()
{
#ifdef LX_JUDGE
	freopen("in.txt", "r", stdin);
#endif

	read(X);
	read(Y);
	read(Z);

	n = X + Y + Z;

	fac[0] = 1;
	rep (i, 1, n)
		fac[i] = (LL) fac[i - 1] * i % mo;
	inv[n] = qpow(fac[n], mo - 2);
	down (i, n, 1)
		inv[i - 1] = (LL) inv[i] * i % mo;

	pow_2[0] = 1;
	rep (i, 1, n)
		(pow_2[i] = pow_2[i - 1] << 1) >= mo ? pow_2[i] -= mo : 0;

	pow_3[0] = 1;
	rep (i, 1, n)
		pow_3[i] = (LL) pow_3[i - 1] * 3 % mo;

	int ans = 0;
	int f = 1, g = 1;

	for (int i = X, c = 0; i <= n; ++i, ++c)
	{
		LL t = (LL) f + g + mo - pow_2[c];
		upd(ans, t * C(i - 1, X - 1) % mo * pow_3[n - i] % mo);
		f = ((LL) f * 2 + mo - C(c, Y)) % mo;
		g = ((LL) g * 2 + mo - C(c, Z)) % mo;
	}

	printf("%d\n", ans);

	return 0;
}
