dij20分
#include<bits/stdc++.h>
#define INF 2147480000
using namespace std;
struct lx
{
int x,y,z;
}w[10000];
int n,m,d;
struct edge
{
int to,nxt,val;
}e[20000];
int hd[108],dis[108],ecnt,a,b;
bool vis[108],boom[108][108];
void add(int u,int v,int val)
{
e[++ecnt].to=v;
e[ecnt].val=val;
e[ecnt].nxt=hd[u];
hd[u]=ecnt;
}
void dij(int s)
{
for(int i=0;i<=n;i++)dis[i]=INF;
dis[s]=0;
priority_queue<pair<int,int> >q;
q.push(make_pair(0,s));
while(!q.empty())
{
int u=q.top().second;
q.pop();
if(vis[u])continue;
vis[u]=1;
for(int i=hd[u];i;i=e[i].nxt)
{
int v=e[i].to;
if(dis[v]>dis[u]+e[i].val)
{
dis[v]=dis[u]+e[i].val;
if(!vis[v])q.push(make_pair(-dis[v],v));
}
}
}
}
int main()
{
cin>>n>>m;
for(int i=1;i<=m;i++)
{
cin>>w[i].x>>w[i].y>>w[i].z;
}
cin>>d;
for(int i=1;i<=d;i++)
{
int x,y;
cin>>x>>y;
boom[x][y]=1;
}
for(int i=1;i<=m;i++)
{
if(boom[w[i].x][w[i].y])
{
add(w[i].x,w[i].y,w[i].z);
add(w[i].y,w[i].x,w[i].z);
}
else
{
add(w[i].x,w[i].y,0);
add(w[i].y,w[i].x,0);
}
}
cin>>a>>b;
dij(a);
cout<<dis[b]<<endl;
return 0;
}