#include<iostream>
#include<algorithm>
#include<string>
#include<queue>
#include<vector>
#include<cmath>
using namespace std;
#define N 1100
#define INF pow(2,31)-1
struct dd {
int v = 0;
int w = 0;
};
vector<dd> e[N];
bool st1[N][N] = {};
int d[N];
int n = 0;
int m = 0;
bool st[N];
priority_queue<pair<int, int> > q;
void texte(int s) {
for (int i = 0; i <= n; i++)d[i] = INF;
d[s] = 0;
q.push(make_pair(0, s));
while (!q.empty()) {
auto a = q.top();
q.pop();
if (st[a.second])continue;
st[a.second] = true;
for (auto i : e[a.second]) {
int v = i.v;
int w = i.w;
if (d[v] > d[a.second] + w) {
if (st1[a.second][v]) {
d[v] = d[a.second] + w;
}
else {
d[v] = d[a.second];
}
q.push(make_pair(-d[v], v));
}
}
}
}
int main() {
cin >> n >> m;
for (int i = 0; i < m; i++) {
int a = 0;
int b = 0;
int c = 0;
cin >> a >> b >> c;
e[a].push_back(dd{ b,c });
e[b].push_back(dd{ a,c });
}
int p = 0;
cin >> p;
for (int i = 0; i < p; i++) {
int a = 0;
int b = 0;
cin >> a >> b;
st1[a][b] = true;
st1[b][a] = true;
}
int begin1 = 0;
int end1 = 0;
cin >> begin1 >> end1;
texte(begin1);
cout << d[end1] << endl;
return 0;
}