/*
本题根据第一问,
把所有点入队
而根据第二问,只要把1入队就好了。
因此spfa()应该调用两遍
*/
#include <bits/stdc++.h>
using namespace std;
const int N=1010,M=21010; //边数如何统计请看图
const int INF=0x3f3f3f3f;
int e[M],ne[M],h[N],w[M],idx;
int dis[N];
int q[N],cnt[N]; //要判定有无解,所以要带上cnt[]
bool st[N];
int n,m1,m2;
void add(int a,int b,int c)
{
e[idx]=b;
w[idx]=c;
ne[idx]=h[a];
h[a]=idx++;
}
bool spfa(int siz) //siz表示把前多少数放进去
{
memset(dis,0x3f,sizeof dis); //求最短路
memset(cnt,0,sizeof cnt);
memset(st,false,sizeof st);
int hh=0,tt=0;
for(int i=1;i<=siz;i++)
{
dis[i]=0;
st[i]=true;
q[tt++]=i;
}
while(hh!=tt)
{
int t=q[hh++];
if(hh==N) hh=0;
st[t]=false;
for(int i=h[t];i!=-1;i=ne[i])
{
int j=e[i];
if(dis[j]>dis[t]+w[i])
{
dis[j]=dis[t]+w[i];
cnt[j]=cnt[t]+1;
if(cnt[j]>=n) return false;
if(!st[j])
{
q[tt++]=j;
if(tt==N) tt=0;
st[j]=true;
}
}
}
}
return true;
}
int main()
{
scanf("%d%d%d",&n,&m1,&m2);
memset(h,-1,sizeof h);
//根据图片建边,建边等价于建立不等式*****
//首先是自己设立的边
for(int i=1;i<n;i++)
{
add(i+1,i,0); //从i+1向i连一条长度为0的边
}
//其次是输入的边
while(m1--)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
if(b<a) swap(a,b); //严格保证 a在b的前面
add(a,b,c);
}
while(m2--)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
if(b<a) swap(a,b);
add(b,a,-c);
}
//spfa(n)表示把前n个点都放进去
if(!spfa(n)) puts("-1");
else
{
spfa(1); //只把第一个点放进去
if(dis[n]==INF) puts("-2");
else printf("%d\n",dis[n]);
}
return 0;
}