#include <algorithm>  
#include <iostream>  
#include <sstream>  
#include <string>  
#include <cstring>
#include <vector>  
#include <queue>  
#include <set>  
#include <map>  
#include <cstdio>  
#include <cstdlib>  
#include <cctype>  
#include <cmath>  
#include <list>  
#include <cassert>
#include <ctime>
#include <climits>
using namespace std;  

#define PB push_back  
#define MP make_pair  
#define SZ(v) ((int)(v).size())  
#define FOR(i,a,b) for(int i=(a);i<(b);++i)  
#define REP(i,n) FOR(i,0,n)  
#define FORE(i,a,b) for(int i=(a);i<=(b);++i)  
#define REPE(i,n) FORE(i,0,n)  
#define FORSZ(i,a,v) FOR(i,a,SZ(v))  
#define REPSZ(i,v) REP(i,SZ(v))  
typedef long long ll;
typedef unsigned long long ull;
ll gcd(ll a,ll b) { return b==0?a:gcd(b,a%b); }

const int MAXN=19;
const int MAXPATH=20;
const int MOD=1000000007;

int n,npath,nfixes;
int fix[MAXPATH][MAXN];

int dp[1<<MAXN];

int calcnmask(int mask,int j) {
	int suf=mask&((1<<j)-1),prf=mask^suf;
	if(prf==0) return suf^(1<<j);
	int lsb=prf&-prf;
	return mask^lsb^(1<<j);
}

void run() {
	scanf("%d%d%d",&n,&npath,&nfixes); --n;
	REP(i,npath) REP(j,n) fix[i][j]=-1;
	REP(i,nfixes) { int a,b,c; scanf("%d%d%d",&a,&b,&c); --a,--b; fix[a][b]=c; }
	memset(dp,0,sizeof(dp)); dp[0]=1;
	REP(i,npath) {
		REP(j,n) for(int mask=(1<<n)-1;mask>=0;--mask) {
			if(dp[mask]==0||((mask>>j)&1)==1) continue;
			int nmask=calcnmask(mask,j);
			if((dp[nmask]+=dp[mask])>=MOD) dp[nmask]-=MOD;
		}
		REP(j,n) if(fix[i][j]!=-1) REP(mask,1<<n) if(((mask>>j)&1)!=fix[i][j]) dp[mask]=0;
		//printf("%d:",i); REP(mask,1<<n) if(dp[mask]!=0) printf(" %x=%d",mask,dp[mask]); puts("");
	}
	int ret=0; REP(mask,1<<n) if((ret+=dp[mask])>=MOD) ret-=MOD; printf("%d\n",ret);
}

int main() {
	run();
	return 0;
}
