#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
#define rep(i,n) for(int i=0,_end_=(n); i<_end_;++i)
#define per(i,n) for(int i=(n)-1; i>=0 ; --i)
#define forn(i,l,r) for(int i=(l),_end_=(r); i<=_end_;++i)
using namespace std;
typedef long long ll;
const ll linf=1ll<<60;
const ll mod=1e9+7;
int n,m,K;
ll dp[21][1100005],pd[1100005][21];
int xjt[21][21],pw2[21];
inline void ADD(int &x,const int &y)
{
	x=(x+y<mod) ? (x+y) : (x+y-mod);
	return;
}
inline int lowbit(const int &i){ return i&(-i); }
void trans(int i)
{
	rep(s,1<<n)
	{
		memset(pd[s],0,sizeof(pd[s][0])*(n+1));
		bool f=1;
		rep(j,n) if(~xjt[i][j] && ((s>>j)&1) !=xjt[i][j]){ f=0; break; }
		pd[s][0]=(f ? dp[i-1][s] : 0);
	}
	ll tmp;
	rep(i,n) rep(s,1<<n) if(tmp=pd[s][i]) 
	{
		if(!((s>>i)&1))
		{
			int t=pw2[n]^pw2[i+1];
			t &=s;
			pd[s^lowbit(t)|(1<<i)][i+1]+=tmp;
		}
		pd[s][i+1]+=tmp;
	}
	rep(s,1<<n) dp[i][s]=pd[s][n]%mod;
	return;
}

int main()
{
	rep(i,21) pw2[i]=(1<<i)-1;
	scanf("%d%d%d",&n,&m,&K);
	memset(xjt,-1,sizeof xjt);
	rep(i,K)
	{
		int x,y;scanf("%d%d",&x,&y);
		scanf("%d",&xjt[x][y-1]);
	}
	--n;
	rep(s,1<<n) dp[0][s]=1;
	forn(i,1,m) trans(i);
	printf("%d\n",dp[m][(1<<n)-1]);
	return 0;
}