#include <iostream>
#include <queue>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <map>
#include <set>
#include <sstream>
#include <stack>
#include <cstdio>
#define ll long long
#define ull unsigned long long
#define ld long double
#define INF 0x3f3f3f3f
using namespace std;
int n, m, k, sum = 0;
int up[10005], down[10005];
bool vis[10005];
int dp[10005][1005];
struct node
{
int back, top;
};
map<int, node> ma;
int main()
{
scanf("%d%d%d", &n, &m, &k);
for (int i = 0; i <= n - 1; i++)
{
scanf("%d%d", &up[i], &down[i]);
for (int j = 0; j <= m; j++)
dp[i + 1][j] = INF;
}
for (int i = 1; i <= k; i++)
{
int a, b, c;
scanf("%d%d%d", &a, &b, &c);
ma[a] = {b, c};
vis[a] = 1;
}
for (int i = 1; i <= n; i++)
{
int a = 0;
int b = m + 1;
if (vis[i])
{
sum++;
a = ma[i].back;
b = ma[i].top;
}
for (int j = 1; j <= m; j++)
{
if (!(j > a && j < b))
continue;
int c = 0;
int d = m + 1;
if (vis[i - 1])
{
c = ma[i - 1].back;
d = ma[i - 1].top;
}
if (j + down[i - 1] < d && j + down[i - 1] > c)
dp[i][j] = min(dp[i][j], dp[i - 1][j + down[i - 1]]);
if (j == m)
{
for (int k = 0; k <= m; k++)
if (j - k < d && j - k > c)
{
int q = k % up[i - 1];
int u = k / up[i - 1];
if (!q)
{
dp[i][j] = min(dp[i][j], dp[i - 1][j - k] + (k == 0 ? 1 : u));
}
else
dp[i][j] = min(dp[i][j], dp[i - 1][j - k] + k / up[i - 1] + 1);
}
}
else
{
if (j - up[i - 1] < d && j - up[i - 1] > c && j - up[i - 1] < b && j - up[i - 1] > a && dp[i - 1][j - up[i - 1]] != INF && dp[i][j - up[i - 1]] != INF)
dp[i][j] = min(dp[i][j], min(dp[i - 1][j - up[i - 1]], dp[i][j - up[i - 1]]) + 1);
else
for (int k = 1; k <= m / up[i - 1]; k++)
if (j - up[i - 1] * k < d && j - up[i - 1] * k > c)
dp[i][j] = min(dp[i][j], dp[i - 1][j - up[i - 1] * k] + k);
}
}
bool qw = true;
for (int j = a + 1; j <= b - 1; j++)
{
if (dp[i][j] != INF)
{
qw = false;
break;
}
}
if (qw)
{
cout << "0" << endl;
cout << sum - 1 << endl;
return 0;
}
}
int ans = INF;
cout << "1" << endl;
for (int j = 1; j <= m; j++)
ans = min(ans, dp[n][j]);
printf("%d", ans);
return 0;
}