#include <cstdio>
#include <vector>
#include <functional>

using namespace std;

constexpr int mod = 1000000007;

// 階乗数n!を最初に計算して、呼ばれた時に返す
class Factorial {
    std::vector<int> table;
public:
    Factorial(int max) : table(max) // max:テーブルのサイズ
    {
        table[0] = 1;
        for (int i = 1; i < max; ++i){
            table[i] = (static_cast<long long>(table[i - 1]) * (i + 1)) % mod;
        }
    }

    long long operator () (int n)
    {
        if (n < 0) return 0;
        if (n == 0) return 1;
        return table[n - 1];
    }
};

class FactorialInverse {
    std::vector<int> table;
    Factorial& fact;
public:
    FactorialInverse(int max, Factorial fact) : table(max), fact(fact) // max:テーブルのサイズ
    {
        int digit  = 0;
        {
            int temp = mod - 2;
            while (temp > 0){
                temp >>= 1;
                ++digit;
            }
        }
        auto origin = fact(max);
        vector<int> powerorigin2(digit);
        powerorigin2[0] = origin;
        for (int i = 1; i < digit; ++i) powerorigin2[i] = (static_cast<long long>(powerorigin2[i - 1]) * powerorigin2[i - 1]) % mod;
        {
            int table_max = 1;
            int temp = mod - 2;
            for (int i = 0; temp > 0; ++i, temp >>= 1){
                if (!(temp & 1)) continue;
                table_max = (static_cast<long long>(table_max) * powerorigin2[i]) % mod;
            }
            table[max - 1] = table_max; // origin^(mod - 2)
        }
        for (int i = max - 2; i >= 0; --i){
            table[i] = (static_cast<long long>(table[i + 1]) * (i + 2)) % mod;
        }
    }

    long long operator () (int n)
    {
        if (n < 0) return 0;
        if (n == 0) return 1;
        return table[n - 1];
    }
};

template <typename T> // 返り値とテーブルの型
class Power3 {
    std::vector<T> table;
public:
    Power3(int max) : table(max) // max:テーブルのサイズ
    {
        table[0] = 3;
        for (int i = 1; i < max; ++i){
            table[i] = (static_cast<long long>(table[i - 1]) * 3) % mod;
        }
    }

    T operator () (int n)
    {
        if (n < 0) return 0;
        if (n == 0) return 1;
        return table[n - 1];
    }
};

int main()
{
    int N, M, K;
    scanf("%d %d %d\n", &N, &M, &K);

    Factorial fact(N + M + K);
    FactorialInverse factinv(N + M + K, fact);
    auto nCr = [&](int n, int r){
        return (((static_cast<long long>(fact(n)) * factinv(r)) % mod) * factinv(n - r)) % mod;
    };
    Power3<int> pow3(M + K);

    int result = 0;
    int old_sum;
    for (int bc = 0; bc <= M + K; ++bc){
        int sum;
        if (bc == 0){
            sum = 1;
        }else if (bc <= min(M, K)){
            sum = (static_cast<long long>(old_sum) * 2) % mod;
        }else if (bc <= max(M, K)){
            sum = (((static_cast<long long>(old_sum) * 2) % mod) - nCr(bc - 1, min(M, K))) % mod;
        }else{
            sum = ((((static_cast<long long>(old_sum) * 2) % mod) + (mod - nCr(bc - 1, M)) % mod) + (mod - nCr(bc - 1, K))) % mod;
        }
        old_sum = sum;
        result += ((((static_cast<long long>(sum) * nCr(N - 1 + bc, bc)) % mod) * pow3(M + K - bc)) % mod);
        result %= mod;
    }
    printf("%d\n", result);
}


Measured memory_bytes: 10752