#include <bits/stdc++.h>
using namespace std;
 
#define ll long long
#define ull unsigned long long
#define db long double
#define pb push_back
#define ppb pop_back
#define F first
#define S second
#define mp make_pair
#define all(x) (x).begin(), (x).end()
 
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
typedef pair <int, int> pii;
typedef pair <ll, ll> pll;
typedef vector <int> vi;
typedef vector <ll> vll;

typedef complex <double> cd;
const int K = 20, MOD = 1e9 + 7, C = 31622;
const double PI = acos(-1);
vector <cd> w[K + 1];
int lg[(1 << K) + 1];

void fft(vector <cd> & a, int inv) {
	int n = a.size();

	int j = 0;
	for (int i = 1; i < n; i++) {
		int k = n >> 1;
		for (; j & k; k >>= 1) {
			j ^= k;
		}
		j ^= k;
		if (i < j) {
			swap(a[i], a[j]);
		}
	}
	cd even, odd;
	for (int len = 2; len <= n; len <<= 1) {
		int m = lg[len];
		for (int i = 0; i < n; i += len) {
			for (int j = 0; j < len / 2; j++) {
				even = a[i + j], odd = a[i + j + len / 2];
				if (inv) {
					even /= 2, odd /= 2;
					odd *= w[m][j == 0 ? 0 : len - j];
				}	else {
					odd *= w[m][j];
				}
				a[i + j] = even + odd;
				a[i + j + len / 2] = even - odd;
			}
		}
	}
}

vll mul(const vi & a, const vi & b) {
	vector <cd> fa(all(a)), fb(all(b));
	int n = 1, need = a.size() + b.size();
	while (n < need) {
		n <<= 1;
	}
	fa.resize(n);
	fb.resize(n);
	fft(fa, 0);
	fft(fb, 0);
	for (int i = 0; i < n; i++) {
		fa[i] *= fb[i];
	}
	fft(fa, 1);
	vll res(need - 1);
	for (int i = 0; i < need - 1; i++) {
		res[i] = llround(fa[i].real());
	}
	return res;
}

vi conv(const vi & a, const vi & b) {
	int A = a.size(), B = b.size();
	vi a1(A), a2(A);
	for (int i = 0; i < A; i++) {
		a1[i] = a[i] % C;
		a2[i] = a[i] / C;
	}
	vi b1(B), b2(B);
	for (int i = 0; i < B; i++) {
		b1[i] = b[i] % C;
		b2[i] = b[i] / C;
	}
	vll c11 = mul(a1, b1);
	vll c12 = mul(a1, b2);
	vll c21 = mul(a2, b1);
	vll c22 = mul(a2, b2);
	
	vi res(A + B - 1);
	for (int i = 0; i < A + B - 1; i++) {
		res[i] = c11[i] % MOD;
		res[i] += (ll)C * ((c12[i] + c21[i]) % MOD) % MOD;
		if (res[i] >= MOD) {
			res[i] -= MOD;
		}
		res[i] += (ll)C * C * (c22[i] % MOD) % MOD;
		if (res[i] >= MOD) {
			res[i] -= MOD;
		}
	}
	return res;
}

void pre_fft() {
	for (int i = 2; i <= 1 << K; i++) {
		lg[i] = lg[i / 2] + 1;
	}
	for (int i = 0; i <= K; i++) {
		w[i].resize(1 << i);
		double ang = 2 * PI / (1 << i);
		for (int j = 0; j < 1 << i; j++) {
			w[i][j] = cd(cos(j * ang), sin(j * ang));
		}
	}
}

const int N = 1e6 + 123;
int fact[N], rev[N], pw[N];

int binpow(int x, int y) {
	int res = 1;
	while (y) {
		if (y & 1) {
			res = (ll)res * x % MOD;
		}
		x = (ll)x * x % MOD;
		y /= 2;
	}
	return res;
}

int binomial(int n, int k) {
	if (k > n) {
		return 0;
	}
	return ((ll)fact[n] * rev[k] % MOD) * rev[n - k] % MOD;
}

int main() {
	ios_base::sync_with_stdio(false), cin.tie(NULL);
	#ifdef LOCAL
		freopen("input.txt", "r", stdin);
	#endif
	
	pre_fft();
	fact[0] = rev[0] = pw[0] = 1;
	for (int i = 1; i < N; i++) {
		fact[i] = (ll)fact[i - 1] * i % MOD;
		rev[i] = (ll)rev[i - 1] * binpow(i, MOD - 2) % MOD;
		pw[i] = (ll)pw[i - 1] * 3 % MOD;
	}
	
	int n, m, k;
	cin >> n >> m >> k;
	
	vi a(m + 1), b(k + 1);
	for (int i = 0; i <= m; i++) {
		a[i] = rev[i];
	}
	for (int i = 0; i <= k; i++) {
		b[i] = rev[i];
	}
	vi c = conv(a, b);
	int res = 0;
	for (int i = 0; i <= m + k; i++) {
		int tmp = (ll)pw[m + k - i] * binomial(n - 1 + i, n - 1) % MOD;
		tmp = (ll)tmp * fact[i] % MOD;
		tmp = (ll)tmp * c[i] % MOD;
		res += tmp;
		if (res >= MOD) {
			res -= MOD;
		}
	}
	cout << res;
}


Measured memory_bytes: 112080