#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
const int N = 10010, M = 110;
int f[N][M];
int T, s, n;
int pc[N];
struct Course
{
int st, ed, w, last;
}c[M];
struct Roads
{
int lim, cost;
}g[N];
bool cmp(Roads a, Roads b)
{
return a.lim == b.lim ? a.cost < b.cost : a.lim < b.lim;
}
int get(int x)
{
for (int i = 1; i <= n; i ++ )
{
if (g[i].lim > x) continue;
x = g[i].lim;
}
return x;
}
int main()
{
scanf("%d%d%d", &T, &s, &n);
for (int i = 1; i <= s; i ++ ) scanf("%d%d%d", &c[i].st, &c[i].last, &c[i].w), c[i].ed = c[i].st + c[i].last;
for (int i = 1; i <= n; i ++ ) scanf("%d%d", &g[i].lim, &g[i].cost);
sort(g + 1, g + n + 1, cmp);
for (int i = 1; i <= 100; i ++ )
pc[i] = get(i);
memset(f, -0x3f, sizeof f);
for (int i = 1; i <= T; i ++ )
for (int j = 0; j <= 100; j ++ )
{
for (int k = 1; k <= s; k ++ )
if (i >= c[k].st && i <= c[k].ed && c[k].w > j) f[c[k].ed][c[k].w] = max(f[c[k].ed][c[k].w], f[i][j]);
for (int k = 1; k <= pc[j]; j ++ )
f[i + g[k].cost][j] = max(f[i + g[k].cost][j], f[i][j] + 1);
}
int res = -0x3f3f3f3f;
for (int i = 1; i <= 100; i ++ ) res = max(res, f[T][i]);
cout << res << endl;
return 0;
}
// 1. 学习课程:f[c[k].ed][c[k].w] = max{f[c[k].ed][c[k].w], f[i][j]}; ( i >= c[k].st && i <= c[k].ed )
// 2. 滑雪: f[i + g[k].cost][j] = max(f[i + g[k].cost][j], f[i][j] + 1); ( j >= g[k].lim )