#include <bits/stdc++.h>
using namespace std;
const double pi = acos(0.0) * 2.0;
const double eps = 1e-12;
const int step[8][2] = {{1, 0}, {-1, 0}, {0, 1},  {0, -1},
                        {1, 1}, {1, -1}, {-1, 1}, {-1, -1}};
template <class T>
inline T abs1(T a) {
  return a < 0 ? -a : a;
}
template <class T>
inline T max1(T a, T b, T c = -1234567, T d = -1234567) {
  T ans = a > b ? a : b;
  if (c != -1234567) ans = max1(ans, c);
  if (d != -1234567) ans = max1(ans, d);
  return ans;
}
template <class T>
inline T min1(T a, T b, T c = -1234567, T d = -1234567) {
  T ans = a < b ? a : b;
  if (c != -1234567) ans = min(ans, c);
  if (d != -1234567) ans = min(ans, d);
  return ans;
}
template <class T>
inline T gcd1(T a, T b) {
  if (a < b) swap(a, b);
  if (a % b == 0) return b;
  return gcd1(b, a % b);
}
template <class T>
inline T lb(T num) {
  return num & (-num);
}
inline int jud(double a, double b) {
  if (abs(a) < eps && abs(b) < eps)
    return 0;
  else if (abs1(a - b) / abs1(a) < eps)
    return 0;
  if (a < b) return -1;
  return 1;
}
template <typename t>
inline int jud(t a, t b) {
  if (a < b) return -1;
  if (a == b) return 0;
  return 1;
}
template <typename it, typename t1>
inline int find(t1 val, it a, int na, bool f_small = 1, bool f_lb = 1) {
  int be = 0, en = na - 1;
  if (*a <= *(a + na - 1)) {
    if (f_lb == 0)
      while (be < en) {
        int mid = (be + en + 1) / 2;
        if (jud(*(a + mid), val) != 1)
          be = mid;
        else
          en = mid - 1;
      }
    else
      while (be < en) {
        int mid = (be + en) / 2;
        if (jud(*(a + mid), val) != -1)
          en = mid;
        else
          be = mid + 1;
      }
    if (f_small && jud(*(a + be), val) == 1) be--;
    if (!f_small && jud(*(a + be), val) == -1) be++;
  } else {
    if (f_lb)
      while (be < en) {
        int mid = (be + en + 1) / 2;
        if (jud(*(a + mid), val) != -1)
          be = mid;
        else
          en = mid - 1;
      }
    else
      while (be < en) {
        int mid = (be + en) / 2;
        if (jud(*(a + mid), val) != 1)
          en = mid;
        else
          be = mid + 1;
      }
    if (!f_small && jud(*(a + be), val) == -1) be--;
    if (f_small && jud(*(a + be), val) == 1) be++;
  }
  return be;
}
inline int bitnum(unsigned long long nValue) {
  nValue = ((0xaaaaaaaaaaaaaaaaull & nValue) >> 1) +
           (0x5555555555555555ull & nValue);
  nValue = ((0xccccccccccccccccull & nValue) >> 2) +
           (0x3333333333333333ull & nValue);
  nValue = ((0xf0f0f0f0f0f0f0f0ull & nValue) >> 4) +
           (0x0f0f0f0f0f0f0f0full & nValue);
  nValue = ((0xff00ff00ff00ff00ull & nValue) >> 8) +
           (0x00ff00ff00ff00ffull & nValue);
  nValue = ((0xffff0000ffff0000ull & nValue) >> 16) +
           (0x0000ffff0000ffffull & nValue);
  nValue = ((0xffffffff00000000ull & nValue) >> 32) +
           (0x00000000ffffffffull & nValue);
  return nValue;
}
long long pow(long long n, long long m, long long mod = 0) {
  long long ans = 1;
  long long k = n;
  while (m) {
    if (m & 1) {
      ans *= k;
      if (mod) ans %= mod;
    }
    k *= k;
    if (mod) k %= mod;
    m >>= 1;
  }
  return ans;
}
const int maxn = 250;
const long long mod = 1000000007;
int n, col;
long long have[maxn];
int dp[5][maxn * 12][maxn * 4];
long long c[3000][3000];
long long stat1[5][maxn * 4][maxn * 4];
int radd[5][3][maxn * 4][maxn * 4];
int main() {
  ios_base::sync_with_stdio(0);
  for (int i = 0; i < 2500; i++) {
    c[i][0] = 1;
    for (int j = 1; j <= i; j++) {
      c[i][j] = c[i - 1][j - 1] + c[i - 1][j];
      if (c[i][j] > mod) c[i][j] -= mod;
    }
  }
  scanf("%d%d", &n, &col);
  have[0] = 1;
  for (int i = 1; i <= n; i++) have[i] = have[i - 1] + 3;
  for (int i = 0; i < 5; i++) {
    long long all = col - i;
    if (all < 0) break;
    for (int t = 0; t <= n * 12; t++) dp[i][t][0] = c[t][all];
    for (int j = 1; j <= n * 4; j++)
      for (int t = 0; t <= n * 12 - j * 2; t++) {
        long long ans1 = (long long)dp[i][t + 2][j - 1] + dp[i][t + 1][j - 1] -
                         dp[i][t][j - 1];
        if (ans1 < 0) ans1 += mod;
        while (ans1 > mod) ans1 -= mod;
        dp[i][t][j] = ans1;
      }
  }
  for (int i = -1; i <= n; i++)
    for (int j = -1; j <= n; j++)
      for (int k = -1; k <= n; k++) {
        int cnt = n * 4;
        int add = 0;
        if (i != -1) add++;
        if (j != -1) add++;
        if (k != -1) add++;
        int i11 = max(0, i), j11 = max(0, j), k11 = max(0, k);
        cnt -= i11 + j11 + k11;
        pair<int, int> be =
            make_pair(cnt, n * 4 - (max(i11, j11) + max(k11, j11)) - i11 - k11);
        stat1[add][be.first][be.second]++;
        add++;
        stat1[add][be.first][be.second]++;
        radd[add][0][be.first][be.second]++;
        radd[add][0][be.first - min(i11, k11)][be.second]--;
        radd[add][1][be.first - min(i11, k11)][be.second]++;
        radd[add][1][be.first - max(i11, k11)][be.second - abs(i11 - k11)]--;
        radd[add][2][be.first - max(i11, k11)][be.second - abs(i11 - k11)]++;
        radd[add][2][be.first - n]
            [be.second - abs(i11 - k11) - 2 * (n - max(i11, k11))]--;
      }
  for (int i = 0; i <= 4; i++)
    for (int k = n * 4; k >= 0; k--)
      for (int j = n * 4; j >= 0; j--) {
        for (int t = 0; t < 3; t++) {
          radd[i][t][j][k] += radd[i][t][j + 1][k + t],
              stat1[i][j][k] += radd[i][t][j + 1][k + t];
          if (radd[i][t][j][k] > mod) radd[i][t][j][k] -= mod;
          if (stat1[i][j][k] > mod) stat1[i][j][k] -= mod;
        }
      }
  for (int i = 0; i <= n; i++)
    for (int j = -1; j <= n; j++)
      for (int k = -1; k <= n; k++) {
        int cnt = n * 4;
        long long add = 0;
        if (i != -1) add++;
        if (j != -1) add++;
        if (k != -1) add++;
        int i11 = max(0, i), j11 = max(0, j), k11 = max(0, k);
        cnt -= i11 * 2 + j11 + k11;
        stat1[add][cnt]
             [4 * n - i11 - max(i11, j11) - max(j11, k11) - max(k11, i11)] += 4;
        if (stat1[add][cnt][4 * n - i11 - max(i11, j11) - max(j11, k11) -
                            max(k11, i11)] > mod)
          stat1[add][cnt][4 * n - i11 - max(i11, j11) - max(j11, k11) -
                          max(k11, i11)] -= mod;
      }
  if (col >= 2)
    for (int i = 0; i <= n; i++)
      for (int j = 0; j <= n; j++) {
        stat1[2][n * 4 - i * 2 - j * 2][4 * n - i - j - max(i, j) * 2] += 2;
        stat1[2][n * 4 - i * 2 - j * 2][4 * n - i - j - max(i, j) * 2] %= mod;
      }
  long long ans = 0;
  for (int k = n * 4; k >= 0; k--)
    for (int j = n * 4; j >= 0; j--)
      for (int t = 0; t < 5; t++)
        if (stat1[t][k][j] && t <= col) {
          ans += dp[t][k * 3 - j * 2][j] * stat1[t][k][j] % mod;
          if (ans > mod) ans -= mod;
        }
  for (long long i = 1; i <= col; i++) ans = ans * i % mod;
  cout << ans << endl;
  return 0;
}
