#include<bits/stdc++.h>
using namespace std;
struct node{
long long to,w,next;
};
node edge[100005];
int n,m,s,cnt,z,x[10005],y[10005],vis[100005],flag,h,t,que[10000005],c[1000005],head[1000005];
long long dis[100005],d[100005];
priority_queue<pair<long long,long long>,vector<pair<long long,long long>>,greater<pair<long long,long long>>> p;
void add(int u,int v,int w){
edge[cnt].to=v;
edge[cnt].w=w;
edge[cnt].next=head[u];
head[u]=cnt++;
}
int main(){
cin>>n>>m;
cnt=1;
int inf=1e9;
for(int i=1;i<=m;i++){
cin>>x[i]>>y[i]>>z;
add(x[i],y[i],z);
}
for(int i=1;i<=n;i++){
dis[i]=2147483647; vis[i]=0;
c[i]=0;
add(0,i,0);
}
dis[0]=0; vis[0]=1;
h=1; t=1;
que[h]=0;
flag=0;
while(h<=t){
if(flag==1) break;
int u=que[h];
for(int i=head[u];i;i=edge[i].next){
int v=edge[i].to;
int w=edge[i].w;
if(dis[v]>dis[u]+w){
dis[v]=dis[u]+w;
if(vis[v]==0){
t++;
que[t]=v;
vis[v]=1;
c[v]++;
if(c[v]>n) {
flag=1;
break;
}
}
}
}
vis[u]=0;
h++;
}
if(flag==1){
cout<<-1<<endl;
return 0;
}
for(int i=1;i<=m;i++) edge[i].w=edge[i].w+dis[x[i]]-dis[y[i]];
for(int l=1;l<=n;l++){
for(int i=1;i<=n;i++){
d[i]=inf;
vis[i]=0;
}
d[l]=0; vis[l]=1;
p.push(make_pair(0,l));
while(p.size()){
int u=p.top().second;
p.pop();
while(vis[u] && p.size()){
u=p.top().second;
p.pop();
}
vis[u]=1;
for(int i=head[u];i;i=edge[i].next){
int v=edge[i].to;
int w=edge[i].w;
if(d[v]>d[u]+w){
d[v]=d[u]+w;
p.push(make_pair(d[v],v));
}
}
}
long long ans=0;
for(int i=1;i<=n;i++){
if(d[i]==inf) ans+=i*inf;
else ans+=i*(d[i]+dis[i]-dis[l]);
}
cout<<ans<<endl;
}
return 0;
}