rt
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=105;
int n,m,d,ans=1e18,start,endd,fa[N],dis[N][N];
set<int> edge[N];
void init(){for(int i=1;i<=n;i++) fa[i]=i;}
int find(int x){return fa[x]==x?x:(fa[x]=find(fa[x]));}
bool family(int x,int y){return find(x)==find(y);}
void merge(int x,int y){if(!family(x,y)) fa[find(x)]=find(y);}
signed main()
{
cin>>n>>m;
init();
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{dis[i][j]=1e18;if(i==j) dis[i][j]=0;}
for(int i=1;i<=m;i++)
{
int x,y,z;
cin>>x>>y>>z;
dis[x][y]=min(dis[x][y],z);
dis[y][x]=min(dis[y][x],z);
edge[x].insert(y);
edge[y].insert(x);
}
cin>>d;
for(int i=1;i<=d;i++)
{
int x,y;
cin>>x>>y;
edge[x].erase(y);
edge[y].erase(x);
}
for(int i=1;i<=n;i++)
for(auto u:edge[i])
merge(i,u);
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
cin>>start>>endd;
for(int i=1;i<=n;i++)
if(find(i)==find(start))
for(int j=1;j<=n;j++)
if(find(j)==find(endd))
ans=min(ans,dis[i][j]);
cout<<ans;
return 0;
}