#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll inf=0x3f3f3f3f3f;
const ll N=20100;
ll n,m,s,t;
ll dis[N],vis[N],sum[N];
struct node
{
ll v; ///点
ll weight; ///权值
};
vector<node>mp[N]; //储存边;
//SPFA写法
ll vv[N];
ll ok[N];
ll SPFA(ll src)
{
ll q;
queue<ll > Q;
vis[src] = 1;
dis[src] = 0;
Q.push(src);
while(!Q.empty())
{
q = Q.front();
Q.pop();
vis[q] = 0;
for(ll i=0; i<mp[q].size(); i++)
{
if(dis[q] + mp[q][i].weight < dis[mp[q][i].v])
{
dis[mp[q][i].v] = dis[q] + mp[q][i].weight;
if(!vis[mp[q][i].v])
{
Q.push(mp[q][i].v);
vis[mp[q][i].v] = 1;
vv[mp[q][i].v]++;
if(vv[mp[q][i].v]>m)///边数多了 直接反回
{
return -1;
}
}
}
}
}
return 0;
}
int main()
{
// printf("inf=%lld\n",inf);
scanf("%d",&n);
m=0;
memset(dis,inf,sizeof(dis));
ll u,v,w;
node ans;
s=inf;
t=0;
for(ll i=1; i<=n; i++)
{
scanf("%lld%lld%lld",&u,&v,&w);
if(ok[u]==0)
{
m++;
ok[u]=m;
}
if(ok[v]==0)
{
m++;
ok[v]=m;
}
///纪录点出现次数,和点数
if(u<s)
s=u;
if(v>t)
t=v;
ans.v = ok[v];
ans.weight = w;
mp[ok[u]].push_back(ans);///此题为单边 所以不用mp[ok[v]].push_back(ans);
}
//printf("t-%lld\n",t);
//printf("m %lld\n",m);
// for(ll i=1;i<=t;i++)
// printf("ok %lld\n",ok[i]);
ll hhh=SPFA(ok[s]);
if(hhh==-1)
printf("%lld\n",hhh);
else
{
printf("%lld\n",dis[ok[t]]==inf?-1:dis[ok[t]]);
}
for(ll i=1; i<=n; i++)
mp[i].clear();
return 0;
}
nsu 2914