#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std;
int n, m, k, l, h, ans1, ans2, cnt, yy;
int a[10005], b[10005], x[10005], y[10005], p[10005];
int dp[10005][1005];
bool flag;
bool f[10005][1005];
//test
bool go[10005][1005];
int main(){
memset(dp, 0x3f, sizeof(dp));
scanf("%d%d%d", &n, &m, &k);
for(int i=0; i<n; i++)scanf("%d%d", &x[i], &y[i]);
for(int i=0; i<=n; i++)a[i]=0, b[i]=m+1;
for(int i=0; i<k; i++)scanf("%d%d%d", &p[i], &l, &h), a[p[i]]=l, b[p[i]]=h;
for(int i=0; i<=m; i++)f[0][i]=1, dp[0][i]=0;
for(int i=0; i<=n; i++){
cout<<"line:"<<i<<" from:"<<a[i]+1<<" to:"<<b[i]-1<<" up:"<<x[i]<<" down:"<<y[i]<<endl;
for(int j=1; j<=m; j++){
if(f[i][j]){
cnt=i;
//test
go[i][j]=true;
//向上转移
yy=min(j+x[i],m);
dp[i][yy]=min(dp[i][yy], dp[i][j]+1);
f[i][yy]=true;
//向右直接转移
yy=min(j+x[i],m);
if(yy>a[i+1]&&yy<b[i+1]){
dp[i+1][yy]=min(dp[i+1][yy], dp[i][j]+1);
f[i+1][yy]=true;
}
//不点
yy=max(j-y[i],0);
if(yy>a[i+1]&&yy<b[i+1]){
dp[i+1][yy]=min(dp[i+1][yy], dp[i][j]);
f[i+1][yy]=true;
}
}
}
}
//test
// printf("\n ");
// for(int i=0; i<=n; i++)printf(" %d", i);
// printf("\n\n");
// for(int j=m; j>=0; j--){
// printf("%2d ", j);
// for(int i=0; i<=n; i++){
// printf("%3d ", go[i][j]?dp[i][j]:-1);
// }
// printf("\n");
// }
// printf("\n");
for(int i=1; i<=m; i++)
if(f[n][i])
flag=true;
if(flag){
ans1=999999999;
for(int i=1; i<=m; i++)
if(f[n][i])
ans1=min(ans1, dp[n][i]);
printf("%d\n%d", flag, ans1);
}
else{
// cout<<"cnt:"<<cnt<<endl;
for(int i=0; i<k; i++)
if(cnt>=p[i])
ans2++;
printf("%d\n%d", flag, ans2);
}
return 0;
}