#include<cstdio>
#include<cstring>
#include<map>
#include<set>
#include<queue>
#include<vector>
#include<iostream>
#include<algorithm>
using namespace std;
#define mp make_pair
#define pb push_back
#define sz(x) ((int)(x).size())
#define rep(i,l,r) for(int i=(l);i<(r);++i)
typedef long long ll;
typedef pair<int,int> pii;
const int N = 9e5 + 7;
const int MOD = 1e9 + 7;
//--------head---------
int n, m, k, f[N], rf[N], x2[N], x3[N];
ll kpow(ll a, ll b) {
	ll r = 1;
	while (b > 0) {
		if (b & 1)
			r = r * a % MOD;
		a = a * a % MOD, b >>= 1;
	}
	return r;
}
void inc(int &x, int y) {
	x += y;
	if (x >= MOD)
		x -= MOD;
}
void init() {
	f[0] = 1;
	rep(i, 1, N)
		f[i] = 1ll * i * f[i - 1] % MOD;
	rf[N - 1] = kpow(f[N - 1], MOD - 2);
	for (int i = N - 2; i >= 0; --i)
		rf[i] = 1ll * (i + 1) * rf[i + 1] % MOD;
	x2[0] = 1;
	rep(i, 1, N)
		x2[i] = 1ll * 2 * x2[i - 1] % MOD;
	x3[0] = 1;
	rep(i, 1, N)
		x3[i] = 1ll * 3 * x3[i - 1] % MOD;
}
ll C(int n, int m) {
	if (n < m)
		return 0;
	return 1ll * f[n] * rf[m] % MOD * rf[n - m] % MOD;
}
int main() {
	init();
	cin >> n >> m >> k;
	++m, ++k;
	int tot = n + m + k, ans = 0;
	int fb = 0, fc = 0;
	rep(i, n, tot - 2 + 1) {
		int cnt = C(i - 1, n - 1), ill = x2[i - n];
		if (m == i - n)
			fb = 1;
		else if (m < i - n) {
			fb = 1ll * 2 * fb % MOD;
			inc(fb, C(i - n - 1, i - n - m));
		}
		if (k == i - n)
			fc = 1;
		else if (k < i - n) {
			fc = 1ll * 2 * fc % MOD;
			inc(fc, C(i - n - 1, i - n - k));
		}
		inc(ill, MOD - fb), inc(ill, MOD - fc);
		inc(ans, 1ll * cnt * ill % MOD * x3[tot - 2 - i] % MOD);
	}
	cout << ans << endl;
	return 0;
}
