import copy
import sys
import math

n = int(sys.stdin.readline())
if n == 1:
    print(0)
    exit()
free_pos = 4 * (n - 1)
res = math.comb(free_pos , 2 * n - 4) * n

skewer_to_fill = (2*n-4) // 4
res %= 1000000007
sign = -1
for i in reversed(range(2, skewer_to_fill+2)):
    res += sign * math.comb(n, i)
    res %= 1000000007
    sign *= -1
print(res % 1000000007)

# res - 1
# num_options = 0
# origin = [-1] * (4 * n)
# stack = [(origin, -1, 0)]
# while stack:
#     setup, idx, num_1 = stack.pop()
#     if num_1 == 2 * n:
#         valid = False
#         for i in range(0, idx + 1, 4):
#             if setup[i] == 1 and setup[i + 1] == 1 and setup[i + 2] == 1 and setup[i + 3] == 1:
#                 valid = True
#                 break
#         if valid:
#             num_options += 1
#         # else:
#             # print(setup)
#     elif idx < 4 * n - 1:
#         new_setup = copy.copy(setup)
#         new_setup[idx + 1] = 0
#         stack.append((new_setup, idx + 1, num_1))
#
#         new_setup = copy.copy(setup)
#         new_setup[idx + 1] = 1
#         stack.append((new_setup, idx + 1, num_1 + 1))
#
# print(num_options)
#
# num_combos= 0
#
# stack = [(0,2*n, 2*n, 0, False)]
# while stack:
#     idx,d,h,streak,goaled = stack.pop()
#
#     if d!=0:
#         if streak == 3 and not goaled:
#             new_goal = True
#         else:
#             new_goal = goaled
#         if idx == 3:
#             new_streak = 0
#             new_idx = 0
#         else:
#             new_streak = streak +1
#             new_idx = idx + 1
#         stack.append((new_idx,d-1,h,new_streak,new_goal))
#
#     if h!=0:
#         if idx == 3:
#             new_streak = 0
#             new_idx = 0
#         else:
#             new_streak = 0
#             new_idx = idx + 1
#         stack.append((new_idx,d,h-1,new_streak,goaled))
#
#     if h==0 and d==0:
#         if goaled:
#             num_combos+=1
#
# print(num_combos)


