问题描述
有N(N+1)/2个点排列成一个等边三角形,其中每边包含N个点,如下所示。从上往下第i行从左往右第j个点表示为(i,j)(1≤i≤N, 1≤j≤i)。此外,我们将(i+1,j)称为(i,j)的左下方的点,将(i+1,j+1)称为(i,j)的右下方的点。

高桥通过连接这些点绘制了M条多边形线段L1,L2,...,LM。每条Li从(1,1)开始,并访问当前点的左下方或右下方的点N−1次。更准确地说,存在Xi,1,...,Xi,N使得:
- Li按照顺序连接N个点(1,Xi,1),(2,Xi,2),...,(N,Xi,N)。
- 对于每个j=1,2,...,N−1,要么Xi,j+1=Xi,j,要么Xi,j+1=Xi,j+1。
高桥希望绘制这些线段,使得Li+1的任何部分都不在Li的左边。也就是说,对于每个j=1,2,...,N,必须满足X1,j≤X2,j≤...≤XM,j。
此外,对线段的形状有K个约束条件必须遵循。第i个条件表示为(Ai,Bi,Ci),其中:
- 如果Ci=0,则LAi必须在第Bi步访问左下方的点。
- 如果Ci=1,则LAi必须在第Bi步访问右下方的点。
也就是说,必须满足XAi,Bi+1=XAi,Bi+Ci。
高桥有多少种方式可以绘制M条多边形线段?找到模1000000007的计数。
注意事项
在提交之前,强烈建议使用"自定义测试"来测量代码的执行时间。
约束条件
- 1≤N≤20
- 1≤M≤20
- 0≤K≤(N−1)M
- 1≤Ai≤M
- 1≤Bi≤N−1
- Ci=0 或者 1
- (Ai,Bi)不会出现两次。
输入
输入以以下格式从标准输入给出:
N M K
A1 B1 C1
A2 B2 C2
:
AK BK CK
输出
输出高桥绘制M条多边形线段的方法数,对1000000007取模。
示例输入1
3 2 1
1 2 0
示例输出1
6
有六种绘制线段的方法,如下所示。其中,红线代表L1,绿线代表L2。

示例输入2
3 2 2
1 1 1
2 1 0
示例输出2
0
示例输入3
5 4 2
1 3 1
4 2 0
示例输出3
172
示例输入4
20 20 0
示例输出4
881396682