题目链接
#include<cstdio>
#include<cstring>
#define MAXN 1005
#define MAXM 10005
using namespace std;
struct edge{
int v,w,next;
edge():next(0){}
}G[MAXM];
int head[MAXN]={0};
long long dis[MAXN];
int N,ML,MD,a,b,d;
int tot = 0;
inline void add(int u,int v,int w){
G[++tot].v=v;G[tot].w=w;G[tot].next=head[u];head[u]=tot;
}
int vis[MAXN]={0};
int C[MAXN];
int q[MAXN*MAXN];
int main(){
memset(vis,0,sizeof(vis));
memset(C,0,sizeof(C));
scanf("%d%d%d",&N,&ML,&MD);
for(register int i=1;i<=ML;++i){
scanf("%d%d%d",&a,&b,&d);
add(a,b,d);
}
for(register int i=1;i<=MD;++i){
scanf("%d%d%d",&a,&b,&d);
add(b,a,-d);
}
for(register int i=1;i<=N;++i){
dis[i]=2147483647;
}
q[1]=1;
vis[1]=1;C[1]=1;
dis[1]=0;
int l = 1;int r = 1;
int cnt = 1;
while(l<=r){
cnt = 0;
for(register int i=l;i<=r;++i){
int u = q[i];
for(register int j=head[u];j;j=G[j].next){
int v = G[j].v;int w = G[j].w;
if(dis[v]>dis[u]+w){
dis[v]=dis[u]+w;
C[v]++;
if(C[v]>N){
puts("-1");
return 0;
}
if(vis[v]==0){
vis[v]=1;
q[(++cnt)+r]=v;
}
}
}
vis[u]=0;
}
l=r+1;r+=cnt;
}
if(dis[N]==2147483647)puts("-2");
else printf("%lld",dis[N]);
return 0;
}