link
#include<iostream>
#include<queue>
#include<cstring>
#define re register
using namespace std;
const int N = 1e4;
int n,m,d,cnt,a,b;
bool vis[N],mark[N][N];
int head[N],dis[N];
struct edge{
int v,w,next;
bool ok = true;
}e[N];
inline void add(int u,int v,int w){
cnt ++;
e[cnt].v = v;
e[cnt].w = w;
e[cnt].next = head[u];
head[u] = cnt;
}
inline void dijkstra(){
typedef pair<int,int> p;
priority_queue<p,vector<p>,greater<p> > q;
dis[a] = 0;
vis[a] = true;
q.push(make_pair(dis[a],a));
while(! q.empty()){
int u = q.top().second;
q.pop();
vis[u] = false;
for(re int i = head[u];i != -1;i = e[i].next){
int v = e[i].v;
if(e[i].ok){
if(dis[v] > dis[u] + e[i].w){
dis[v] = dis[u] + e[i].w;
if(! vis[v]){
vis[v] = true;
q.push(make_pair(dis[v],v));
}
}
}else{
dis[v] = dis[u];
}
}
}
}
inline void cs(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
memset(head,-1,sizeof(head));
memset(dis,0x3f,sizeof(dis));
}
int main(){
cs();
cin>>n>>m;
for(re int i = 1;i <= m;i ++){
int x,y,z;
cin>>x>>y>>z;
add(x,y,z);
add(y,x,z);
}
cin>>d;
for(re int i = 1;i <= d;i ++){
int x,y;
cin>>x>>y;
int v = e[i].v,t = e[i].next;
if( (x == v && y == t) || (x == t && y == v) ){
e[i].ok = false;
}
}
cin>>a>>b;
dijkstra();
cout<<dis[b]<<"\n";
return 0;
}