#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
const int MAXN = 1010;
const int MAXM = 200010;
const int INF = 0x3f3f3f3f;
bool vis[MAXN];
int N, ML, MD, tot, head[MAXN], num[MAXN], dis[MAXN];
struct Edge {
int to, cost, next;
}edge[MAXM];
void Init() {
tot = 0;
for (int i = 1; i <= N; i++) head[i] = -1;
}

void AddEdge(int u, int v, int cost) {
tot++;
edge[tot].to = v;
edge[tot].cost = cost;
edge[tot].next = head[u];
head[u] = tot;
}

int spfa() {
for (int i = 1; i <= N; i++) dis[i] = INF, vis[i] = false, num[i] = 0;
dis[1] = 0, num[1]++;
queue<int> q; q.push(1);
while (!q.empty()) {
int u = q.front(); q.pop();
vis[u] =false;
for (int i = head[u]; i != -1; i = edge[i].next) {
int v = edge[i].to, cost = edge[i].cost;
if (dis[v] > dis[u] + cost) {
dis[v] = dis[u] + cost;
if (!vis[v]) {
vis[v] = true;
num[v]++;
q.push(v);
if (num[v] > N) {
return -1;
}
}
}
}
}
return dis[N] == INF ? -2 : dis[N];
}

int main() {
while (~scanf("%d %d %d", &N, &ML, &MD)) {
Init();
for (int i = 1; i <= ML; i++) {
int u, v, cost; scanf("%d %d %d", &u, &v, &cost);
AddEdge(u, v, cost);
}
for (int i = 1; i <= MD; i++) {
int u, v, cost; scanf("%d %d %d", &u, &v, &cost);
AddEdge(v, u, -cost);
}
printf("%d\n", spfa());
}
return 0;
}