#include<bits/stdc++.h>
#define int long long
using namespace std;
long long md=1e9;
long long n,m,k,ans,ans1;
long long fa[1000010],dis[1000010],cl[1000010];
struct tx{
long long x,y,c;
}q[1000010];
long long qpow(long long x,long long k)
{
int num=x,ansq=1;
for(int i=0;i<=40;i++)
{
if(k==0) break;
if(k%2==1)
{
ansq=(ansq*num)%md;
}
k=k/2;
num=(num*num)%md;
}
return ansq;
}
long long finds(long long x)
{
if(fa[x]==x) return x;
int a=finds(fa[a]);
dis[x]=(dis[x]+dis[fa[x]])%2;
fa[x]=a;
return fa[x];
}
long long D(long long a,long long b)
{
if(a==1) return b;
else return a+m;
}
signed main()
{
freopen("ti.in","r",stdin);
ios::sync_with_stdio(0);
cin>>n>>m>>k;
for(int i=1;i<=k;i++)
{
cin>>q[i].x>>q[i].y>>q[i].c;
}
for(int i=1;i<=n+m+1;i++)
{
fa[i]=i;
dis[i]=0;
cl[i]=-1;
}
int num=n+m-2;
cl[D(1,1)]=0;
ans1=0;
for(int i=1;i<=k;i++)
{
int u=q[i].x,v=q[i].y,c=q[i].c;
if(u==1||v==1)
{
if(cl[finds(D(u,v))]==-1)
{
cl[finds(D(u,v))]=c xor dis[D(u,v)];
num--;
}
else
{
if(cl[finds(D(u,v))] xor dis[D(u,v)]!=c)
{
ans1=1;
break;
}
}
}
else
{
if(finds(D(u,1))==finds(D(1,v)))
{
if(cl[finds(D(u,1))]==-1) continue;
int x=0;
if(u%2==0&&v%2==0) x=1;
x=cl[D(1,1)] xor x xor c;
if(dis[D(u,1)] xor dis[D(1,v)]!=x)
{
ans1=1;
break;
}
}
else
{
fa[finds(D(u,1))]=finds(D(1,v));
num--;
}
}
}
if(ans1==0) ans+=qpow(2,num);
for(int i=1;i<=n+m+1;i++)
{
fa[i]=i;
dis[i]=0;
cl[i]=-1;
}
num=n+m-2;
cl[D(1,1)]=1;
ans1=0;
for(int i=1;i<=k;i++)
{
int u=q[i].x,v=q[i].y,c=q[i].c;
if(u==1||v==1)
{
if(cl[finds(D(u,v))]==-1)
{
cl[finds(D(u,v))]=c xor dis[D(u,v)];
num--;
}
else
{
if(cl[finds(D(u,v))] xor dis[D(u,v)]!=c)
{
ans1=1;
break;
}
}
}
else
{
if(finds(D(u,1))==finds(D(1,v)))
{
if(cl[finds(D(u,1))]==-1) continue;
int x=0;
if(u%2==0&&v%2==0) x=1;
x=cl[D(1,1)] xor x xor c;
if(dis[D(u,1)] xor dis[D(1,v)]!=x)
{
ans1=1;
break;
}
}
else
{
fa[finds(D(u,1))]=finds(D(1,v));
num--;
}
}
}
if(ans1==0) ans+=qpow(2,num);
cout<<ans;
fclose(stdin);
return 0;
}