/*
❤️❤️❤️I_love_QMsh❤️❤️❤️
*/

#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>

#define all(x) (x).begin(), (x).end()
#define rall(x) (x).rbegin(), (x).rend()
#define x first
#define y second

using namespace std;
using namespace __gnu_pbds; // gp_hash_table<int, int> table;

typedef tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update> ordered_set; // <int> .find_by_order(int) .order_of_key(int)

template<typename T> bool smin(T &a, const T &b) { bool ret = b < a; return a = (ret ? b : a), ret; }
template<typename T> bool smax(T &a, const T &b) { bool ret = a < b; return a = (ret ? b : a), ret; }

typedef long long ll;
typedef long double ld;
typedef unsigned int uint;
typedef unsigned long long ull;

mt19937 rnd;

const int M = (int)1e9 + 7;

int ml(int a, int b) {
  return 1ll * a * b % M;
}

int sm(int a, int b) {
  a += b;
  if (a >= M) {
    a -= M;
  }
  return a;
}

int bpow(int a, int st) {
  if (st < 0) {
    st += M - 1;
  }
  int res = 1;
  while (st) {
    if (st & 1) {
      res = ml(res, a);
    }
    a = ml(a, a);
    st /= 2;
  }
  return res;
}

const int N = 3e5 + 10;
int f[3 * N];
int fi[3 * N];
int st3[3 * N];

signed main() {
  ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);

  f[0] = fi[0] = st3[0] = 1;

  for (int i = 1; i < 3 * N; i++) {
    f[i] = ml(f[i - 1], i);
    fi[i] = bpow(f[i], -1);
    st3[i] = ml(st3[i - 1], 3);
  }

  int n, m, k;
  cin >> n >> m >> k;
  n--;

  int ans = 0;
  for (int i = 0; i <= m; i++) {
    int cur = 0;
    for (int j = 0; j <= k; j++) {
      cur = sm(cur, ml(ml(ml(f[n + i + j], fi[n]), fi[j]), st3[m + k - i - j]));
    }
    ans = sm(ans, ml(cur, fi[i]));
  }

  cout << ans << '\n';


  return 0;
}