#include <iostream>
#include <vector>
#include <set>
#include <unordered_set>
#include <bitset>
#include <map>
#include <unordered_map>
#include <deque>
#include <queue>
#include <string>
#include <tuple>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <cmath>
#include <cassert>

#define pb push_back
#define pbk pop_back
#define sz(a) ((int) (a).size())
#define all(a) (a).begin(), (a).end()
#define mp make_pair
#define mt make_tuple
#define fs first
#define sc second
#define next hunext
#define prev huprev
#define rank hurank
#define hash huhash

#ifdef LOCAL42
#define eprintf(...) fprintf(stderr, __VA_ARGS__)
#else
#define eprintf(...) 42
#endif

using namespace std;

typedef unsigned int uint;
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
typedef vector<int> vi;
typedef pair<int, int> pii;

const int inf = int(1e9);
const ll linf = ll(1e18);
const double eps = 1e-9;
const double pi = 4 * atan(1.0);
const int MOD = int(1e9) + 7;
const int P = 100;
const int N = int(1e6);
const int SZ = (1 << 20);
const int K = 5;

struct base {
    
    double a, b;
    
    base() : a(0), b(0) {}
    
    base(double a, double b = 0) : a(a), b(b) {}
    
};

inline base operator + (const base& a, const base& b) {
    return base(a.a + b.a, a.b + b.b);
}

inline base operator - (const base& a, const base& b) {
    return base(a.a - b.a, a.b - b.b);
}

inline base operator * (const base& a, const base& b) {
    return base(a.a * b.a - a.b * b.b, a.a * b.b + a.b * b.a);
}

inline base operator / (const base& a, double b) {
    return base(a.a / b, a.b / b);
}

int maxv;
base a[K][SZ], ab[K * 2][SZ];
int f[N], rf[N];

inline int calc(int a, int b) {
    int res = 1;
    while (b > 0) {
        if (b % 2 != 0) {
            res = (1LL * res * a) % MOD;
        }
        a = (1LL * a * a) % MOD;
        b /= 2;
    }
    return res;
}

inline void fft(base* a, int n, bool fl) {
    for (int i = 1, j = 0; i < n; ++i) {
        int bit = n / 2;
        for (; j >= bit; bit /= 2) {
            j -= bit;
        }
        j += bit;
        if (i < j) {
            swap(a[i], a[j]);
        }
    }
    for (int len = 2; len <= n; len *= 2) {
        double ang = 2 * pi / len * (fl ? -1 : 1);
        base wlen(cos(ang), sin(ang));
        for (int i = 0; i < n; i += len) {
            base w(1);
            for (int j = 0; j < len / 2; ++j) {
                base u = a[i + j], v = a[i + j + len / 2] * w;
                a[i + j] = u + v;
                a[i + j + len / 2] = u - v;
                w = w * wlen;
            }
        }
    }
    if (fl) {
        for (int i = 0; i < n; ++i) {
            a[i] = a[i] / n;
        }
    }
}

int main() {
    //cerr << (sizeof(a) + sizeof(ab) + sizeof(f) + sizeof(rf)) / 1024 / 1024 << endl;
#ifdef LOCAL42
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
#endif
    int n, m, k;
    cin >> n >> m >> k;
    f[0] = 1;
    for (int i = 1; i <= n + m + k; ++i) {
        f[i] = (1LL * f[i - 1] * i) % MOD;
    }
    rf[n + m + k] = calc(f[n + m + k], MOD - 2);
    for (int i = n + m + k - 1; i >= 0; --i) {
        rf[i] = (1LL * rf[i + 1] * (i + 1)) % MOD;
    }
    for (int i = 0; i <= m; ++i) {
        int cur = rf[i];
        for (int j = 0; j < K; ++j) {
            a[j][i].a = cur % P;
            cur /= P;
        }
        assert(cur == 0);
    }
    for (int i = 0; i <= k; ++i) {
        int cur = rf[i];
        for (int j = 0; j < K; ++j) {
            a[j][i].b = cur % P;
            cur /= P;
        }
        assert(cur == 0);
    }
    maxv = 1;
    while (maxv < max(m, k) + 1) {
        maxv *= 2;
    }
    maxv *= 2;
    assert(maxv <= SZ);
    for (int i = 0; i < K; ++i) {
        fft(a[i], maxv, false);
    }
    for (int i = 0; i < K; ++i) {
        for (int j = 0; j < K; ++j) {
            for (int z = 0; z < maxv; ++z) {
                ab[i + j][z] = ab[i + j][z] + a[i][z] * a[j][z];
            }
        }
    }
    for (int i = 0; i < 2 * K; ++i) {
        fft(ab[i], maxv, true);
    }
    int ans = 0, pw3 = 1, inv3 = calc(3, MOD - 2);
    for (int i = 0; i <= m + k; ++i) {
        int sum = 0;
        for (int j = 2 * K - 1; j >= 0; --j) {
            sum = (1LL * sum * P + ll(ab[j][i].b + 0.5) / 2) % MOD;
        }
        sum = (1LL * sum * pw3) % MOD;
        sum = (1LL * sum * f[n - 1 + i]) % MOD;
        ans += sum;
        if (ans >= MOD) {
            ans -= MOD;
        }
        pw3 = (1LL * inv3 * pw3) % MOD;
    }
    ans = (1LL * ans * calc(3, m + k)) % MOD;
    ans = (1LL * ans * rf[n - 1]) % MOD;
    cout << ans << endl;
    return 0;
}


Measured memory_bytes: 253056