Problem: There are N stations in the city where JOI lives, and they are numbered 1, 2, ..., and N, respectively. In addition, there are M railway lines, numbered 1, 2, ..., and M, respectively. The railway line i (1 \ leq i \ leq M) connects station A_i and station B_i in both directions, and the fare is C_i yen.

JOI lives near station S and attends IOI high school near station T. Therefore, I decided to purchase a commuter pass that connects the two. When purchasing a commuter pass, you must specify one route between station S and station T at the lowest fare. With this commuter pass, you can freely get on and off the railway lines included in the specified route in both directions.

JOI also often uses bookstores near Station U and Station V. Therefore, I wanted to purchase a commuter pass so that the fare for traveling from station U to station V would be as small as possible.

When moving from station U to station V, first select one route from station U to station V. The fare to be paid on the railway line i included in this route is

* If railway line i is included in the route specified when purchasing the commuter pass, 0 yen
* If railway line i is not included in the route specified when purchasing the commuter pass, C_i yen



It becomes. The total of these fares is the fare for traveling from station U to station V.

I would like to find the minimum fare for traveling from station U to station V when the route specified when purchasing a commuter pass is selected successfully.

Task

Create a program to find the minimum fare for traveling from station U to station V when you have successfully selected the route you specify when purchasing a commuter pass.

input

Read the following input from standard input.

* Two integers N and M are written on the first line. These indicate that there are N stations and M railroad lines in the city where JOI lives.
* Two integers S and T are written on the second line. These indicate that JOI purchases a commuter pass from station S to station T.
* Two integers U and V are written on the third line. These indicate that JOI wants to minimize the fare for traveling from station U to station V.
* Three integers A_i, B_i, and C_i are written in the i-th line (1 \ leq i \ leq M) of the following M lines. These indicate that the railway line i connects station A_i and station B_i in both directions, and the fare is C_i yen.



output

Output the minimum fare for traveling from station U to station V on one line to the standard output when the route from station S to station T is properly specified when purchasing a commuter pass.

Limits

All input data satisfy the following conditions.

* 2 \ leq N \ leq 100 000.
* 1 \ leq M \ leq 200 000.
* 1 \ leq S \ leq N.
* 1 \ leq T \ leq N.
* 1 \ leq U \ leq N.
* 1 \ leq V \ leq N.
* S ≠ T.
* U ≠ V.
* S ≠ U or T ≠ V.
* You can reach any other station from any station using one or more railway lines.
* 1 \ leq A_i <B_i \ leq N (1 \ leq i l \ leq M).
* 1 For \ leq i <j \ leq M, A_i ≠ A_j or B_i ≠ B_j.
* 1 \ leq C_i \ leq 1 000 000 000 (1 \ leq i \ leq M).



Input / output example

Input example 1


6 6
1 6
14
1 2 1
2 3 1
3 5 1
2 4 3
4 5 2
5 6 1


Output example 1


2


In this input example, the route that can be specified when buying a commuter pass is limited to the route of station 1-> station 2-> station 3-> station 5-> station 6.

To minimize the fare for traveling from station 1 to station 4, choose the route station 1-> station 2-> station 3-> station 5-> station 4. If you choose this route, the fare to be paid on each railway line is

* 2 yen for railway line 5 connecting station 4 and station 5.
* 0 yen for other railway lines.



Therefore, the total fare is 2 yen.

Input example 2


6 5
1 2
3 6
1 2 1000000000
2 3 1000000000
3 4 1000000000
4 5 1000000000
5 6 1000000000


Output example 2


3000000000


In this input example, the commuter pass is not used to move from station 3 to station 6.

Input example 3


8 8
5 7
6 8
1 2 2
2 3 3
3 4 4
1 4 1
1 5 5
2 6 6
3 7 7
4 8 8


Output example 3


15


Input example 4


5 5
1 5
twenty three
1 2 1
2 3 10
2 4 10
3 5 10
4 5 10


Output example 4


0


Input example 5


10 15
6 8
7 9
2 7 12
8 10 17
1 3 1
3 8 14
5 7 15
2 3 7
1 10 14
3 6 12
1 5 10
8 9 1
2 9 7
1 4 1
1 8 1
2 4 7
5 6 16


Output example 5


19





Creative Commons License
Information Olympics Japan Committee work "17th Japan Information Olympics (JOI 2017/2018) Final Selection"





Example

Input

6 6
1 6
1 4
1 2 1
2 3 1
3 5 1
2 4 3
4 5 2
5 6 1


Output

2

Solution (in CPP):

Solution:
#include <stdio.h>
#include <cmath>
#include <algorithm>
#include <cfloat>
#include <stack>
#include <queue>
#include <vector>
#include <string>
#include <iostream>
#include <set>
#include <map>
#include <time.h>
typedef long long int ll;
typedef unsigned long long int ull;
#define BIG_NUM 2000000000
#define MOD 1000000007
#define EPS 0.000000001
using namespace std;

#define HUGE_NUM 99999999999999999
#define NUM 100001

enum Type{
	from_S,
	from_T,
	from_U,
	from_V,
};

struct Edge{
	Edge(int arg_to,ll arg_cost){
		to = arg_to;
		cost = arg_cost;
	}
	int to;
	ll cost;
};

struct Info{
	Info(int arg_node_id,ll arg_sum_cost){
		node_id = arg_node_id;
		sum_cost = arg_sum_cost;
	}
	bool operator<(const struct Info & arg) const{
		return sum_cost > arg.sum_cost;
	}

	int node_id;
	ll sum_cost;
};

struct Data{
	Data(int arg_node_id,ll arg_dist){
		node_id = arg_node_id;
		dist = arg_dist;
	}
	bool operator<(const struct Data &arg) const{
		return dist < arg.dist;
	}

	int node_id;
	ll dist;
};

int N,M,S,T,U,V;
int start[4];
vector<Edge> G[NUM];
ll min_dist[NUM][4],min_dist_from_U[NUM];

void calc(Type type){

	for(int i = 1; i <= N; i++){
		min_dist[i][type] = HUGE_NUM;
	}

	min_dist[start[type]][type] = 0;

	priority_queue<Info> Q;
	Q.push(Info(start[type],0));

	int next_node;
	ll next_cost;

	while(!Q.empty()){
		if(Q.top().sum_cost > min_dist[Q.top().node_id][type]){
			Q.pop();
		}else{

			for(int i = 0; i < G[Q.top().node_id].size(); i++){
				next_node = G[Q.top().node_id][i].to;
				next_cost = Q.top().sum_cost+G[Q.top().node_id][i].cost;

				if(min_dist[next_node][type] > next_cost){
					min_dist[next_node][type] = next_cost;
					Q.push(Info(next_node,next_cost));
				}
			}
			Q.pop();
		}
	}
}

int main(){

	scanf("%d %d",&N,&M);
	scanf("%d %d",&S,&T);
	scanf("%d %d",&U,&V);

	start[from_S] = S;
	start[from_T] = T;
	start[from_U] = U;
	start[from_V] = V;

	int from,to;
	ll cost;

	for(int loop = 0; loop < M; loop++){
		scanf("%d %d %lld",&from,&to,&cost);
		G[from].push_back(Edge(to,cost));
		G[to].push_back(Edge(from,cost));
	}

	calc(from_S);
	calc(from_T);
	calc(from_U);
	calc(from_V);

	vector<Data> DATA;

	for(int i = 1; i <= N; i++){
		DATA.push_back(Data(i,min_dist[i][from_S]));
	}
	sort(DATA.begin(),DATA.end());

	ll ans = min_dist[V][from_U];
	int node_id,adj_node;

	for(int i = 1; i <= N; i++)min_dist_from_U[i] = min_dist[i][from_U];

	for(int i = 0; i < DATA.size(); i++){
		node_id = DATA[i].node_id;
		ans = min(ans,min_dist[node_id][from_U]+min_dist[node_id][from_V]);
		for(int k = 0; k < G[node_id].size(); k++){
			adj_node = G[node_id][k].to;
			if(min_dist[node_id][from_S]+G[node_id][k].cost+min_dist[adj_node][from_T] != min_dist[T][from_S])continue;
			min_dist[adj_node][from_U] = min(min_dist[adj_node][from_U],min_dist[node_id][from_U]);
		}
	}

	for(int i = 0; i < DATA.size(); i++){
		node_id = DATA[i].node_id;
		ans = min(ans,min_dist[node_id][from_V]+min_dist_from_U[node_id]);
		for(int k = 0; k < G[node_id].size(); k++){
			adj_node = G[node_id][k].to;
			if(min_dist[node_id][from_S]+G[node_id][k].cost+min_dist[adj_node][from_T] != min_dist[T][from_S])continue;
			min_dist[adj_node][from_V] = min(min_dist[adj_node][from_V],min_dist[node_id][from_V]);
		}
	}

	printf("%lld\n",ans);

	return 0;
}