// n头牛 按1到n顺序站 当然 i可以和i+1站一起 不过不能站i+1后面
// 现在给你些约束 前ml个约束 a,b,d a<b,a和b距离不能大于d 后md个约束 a,b,d a<b ,a和b距离不能低于d
// 根据题目说的 还有 b-a>=0这个约束( 其中 a,b相邻 b编号比a大) 具体见代码
#include <iostream>
#include <map>
#include <algorithm>
#include <queue>
#include <math.h>
#include <stdio.h>
#include <string.h>
#include <vector>
using namespace std;
#define MOD 1000000007
#define maxn 21010
#define maxm 1010
struct node{
int to;
int next;
int val;
}E[maxn];
int num;
int V[maxm];
int d[maxm],cnt[maxm];
bool f[maxm];
bool sfpa(int s,int t){ // s既表示起点 有表示节点个数
queue <int> Q;
int u,v;
int e;
Q.push(s);
d[s]=0;
f[s]=true;
while(!Q.empty()){
u=Q.front(); Q.pop();
cnt[u]++;
if(cnt[u]>t) return false; // 刚刚还说模板好 结果就被坑了,起点换了 这次是t代表元素个数了、、
f[u]=false;
for(e=V[u];e!=-1;e=E[e].next){
v=E[e].to;
if(d[u]+E[e].val<d[v]){
d[v]=d[u]+E[e].val;
if(!f[v])
{
f[v]=true;
Q.push(v);
}
}
}
}
return true;
}
int main(){
int i,j,k;
int n,ml,md;
while(scanf("%d %d %d",&n,&ml,&md)!=EOF){
for(i=1;i<=n;i++)
{
V[i]=-1;
d[i]=MOD;
cnt[i]=0;
f[i]=false;
}
num=0;
while(ml--){
scanf("%d %d %d",&i,&j,&k);
E[num].to=j;
E[num].val=k;
E[num].next=V[i];
V[i]=num++;
}
while(md--){
scanf("%d %d %d",&i,&j,&k);
E[num].to=i;
E[num].val=-k;
E[num].next=V[j];
V[j]=num++;
}
for(i=n;i>1;i--){
E[num].to=i-1;
E[num].val=0;
E[num].next=V[i];
V[i]=num++;
}
if(!sfpa(1,n))
printf("-1
");
else{
if(d[n]==MOD) d[n]=-2;
printf("%d
",d[n]);
}
}
}