#include int mod = 1000000007; #define ll long using namespace std; int dp[400], dp2[400]; int at(int a, int b){ return dp2[20*a+b]; } int issempty(int a){ if (a == -1) return 1; return 0; } int op(int s){ if(s <= 9) { return s + 1; } return 19 - s; } int main() { int n,k,m; scanf("%d %d %d", &n, &k, &m); short vyplnene[2*n]; for(int i = 0; i < 2*n; i++) { vyplnene[i] = -1; } for(int i = 0; i < m; i++) { int x, y, v; scanf("%d %d %d", &x, &y, &v); vyplnene[x*2+y] = v; } int fixed = issempty(vyplnene[0]) + issempty(vyplnene[1]); int fixed2 = issempty(vyplnene[2])+ issempty(vyplnene[3]); //cout<<"fixed"<= 19) continue; if(k-f-s < 0) continue; dp[20*s+k-f-s] = (at(f,s)*op(k-f-s) + dp[20*s+k-f-s]) % mod; } } } else if(vyplnene[2*i] * vyplnene[2*i+1] < 0 && 0 != vyplnene[2*i] + vyplnene[2*i+1]) { int t = vyplnene[2*i] + vyplnene[2*i+1] + 1; for(int f = 0; f < 20; f++) { for(int s = 0; s < 20; s++) { if(k-f-s-t < 0) continue; if(k-f-s-t >= 10) continue; dp[20*s+k-f-s] = (at(f,s) + dp[20*s+k-f-s]) % mod; } } } else { int t = vyplnene[2*i] + vyplnene[2*i+1]; for(int f = 0; f < 20; f++) { int s = k-f-t; if(s < 0) continue; if(s >= 19) continue; dp[20*s+k-f-s] = (at(f,s) + dp[20*s+k-f-s]) % mod; } } } int res = 0; for(int i = 0; i < 400; i++) { res += dp[i]; } printf("%d\n", res % mod); }