/*
求n头牛最远距离
喜欢的牛 s[b]-s[a]<=c
不喜欢的 s[b]-s[a]>=c->s[a]-s[b]<=-c
隐含关系:
编号小的在前 s[i]-s[i+1]<=0
cot[]>n 存在负环 不存在这样的排序
跑出inf 可以无限远
*/
# include <stdio.h>
# include <algorithm>
# include <string.h>
# include <queue>
# include <stack>
using namespace std;
# define MAX 1010
# define M 10010
# define INF 0x3fffff
struct node
{
int u;
int v;
int val;
int next;
} Edge[M<<2];
int head[MAX];
int vis[MAX];
int dis[MAX];
int cot[MAX];
int tot;
int n;
void addEdge(int u,int v,int val)
{
Edge[tot].u=u;
Edge[tot].v=v;
Edge[tot].val=val;
Edge[tot].next=head[u];
head[u]=tot++;
}
int Spfa()
{
queue<int>q;
for(int i=1; i<=n; i++)
{
dis[i]=INF;
}
dis[1]=0;
vis[1]=1;
cot[1]++;
q.push(1);
while(!q.empty())
{
int u=q.front();
q.pop();
vis[u]=0;
for(int i=head[u]; i!=-1; i=Edge[i].next)
{
int v=Edge[i].v;
if(dis[v]>dis[u]+Edge[i].val)
{
dis[v]=dis[u]+Edge[i].val;
if(!vis[v])///防止出现负环
{
vis[v]=1;
q.push(v);
}
}
if(++cot[v]>n)///有负环 没有方案
return -1;
}
}
return dis[n];
}
int main()
{
int ml,md,a,b,c;
while(~scanf("%d%d%d",&n,&ml,&md))
{
tot=0;
memset(head,-1,sizeof(head));
memset(vis,0,sizeof(vis));
memset(cot,0,sizeof(cot));
while(ml--)
{
scanf("%d%d%d",&a,&b,&c);
addEdge(a,b,c);
}
while(md--)
{
scanf("%d%d%d",&a,&b,&c);
addEdge(b,a,-c);
}
for(int i=1; i<n; i++)
addEdge(i+1,i,0);
int ans=Spfa();
if(ans==INF)///可以任意远
printf("-2\n");
else
printf("%d\n",ans);
}
return 0;
}