#include<bits/stdc++.h>
#define int long long
#define pii pair<int,int>
using namespace std;
const int maxn=1e5+10;
bool vis[maxn];
int n,m,k;
struct node
{
int x,y,z;
}e[maxn];
int fat[maxn];
int get(int x)
{
if(x==fat[x]) return x;
return fat[x]=get(fat[x]);
}
int d[maxn],d_42[43][maxn],p[maxn];
vector<pii> gr[maxn];
void dij(int x)
{
priority_queue<pii,vector<pii>,greater<pii>> q;
for(int i=1;i<=n;i++) vis[i]=0;
d_42[x][p[x]]=0;
q.push({0,p[x]});
while(!q.empty())
{
int u=q.top().second;
q.pop();
if(vis[u]) continue;
vis[u]=1;
for(int i=0;i<gr[u].size();i++)
{
int v=gr[u][i].first,w=gr[u][i].second;
if(d_42[x][v]>d_42[x][u]+w)
{
d_42[x][v]=d_42[x][u]+w;
q.push({d_42[x][v],v});
}
}
}
}
int g[maxn],cnt;
int fa[maxn][21];
void dfs(int u,int f)
{
for(int i=0;i<gr[u].size();i++)
{
int v=gr[u][i].first,w=gr[u][i].second;
if(v==f) continue;
fa[v][0]=u;
d[v]=d[u]+w;
dfs(v,u);
}
}
int lca(int x,int y)
{
if(d[x]<d[y]) swap(x,y);
for(int i=20;i>=0;i--)
if(d[fa[x][i]]>=d[y]) x=fa[x][i];
if(x==y) return x;
for(int i=20;i>=0;i--)
if(fa[x][i]!=fa[y][i]) x=fa[x][i],y=fa[y][i];
return fa[x][0];
}
signed main()
{
cin>>n>>m;
for(int i=1;i<=m;i++) cin>>e[i].x>>e[i].y>>e[i].z;
for(int i=1;i<=n;i++) fat[i]=i;
for(int i=1;i<=m;i++)
{
int fx=get(e[i].x),fy=get(e[i].y);
if(fx==fy)
{
g[i]=1;
p[++cnt]=e[i].x;
p[++cnt]=e[i].y;
continue;
}
fat[fx]=fy;
}
for(int i=1;i<=m;i++)
if(!g[i])
{
gr[e[i].x].push_back({e[i].y,e[i].z});
gr[e[i].y].push_back({e[i].x,e[i].z});
}
dfs(1,0);
for(int i=1;i<=20;i++)
for(int j=1;j<=n;j++)
fa[j][i]=fa[fa[j][i-1]][i-1];
for(int i=1;i<=m;i++)
if(g[i])
{
gr[e[i].x].push_back({e[i].y,e[i].z});
gr[e[i].y].push_back({e[i].x,e[i].z});
}
for(int i=1;i<=cnt;i++)
{
for(int j=1;j<=n;j++) d_42[i][j]=1e15;
d_42[i][p[i]]=0;
dij(i);
}
int q;
cin>>q;
for(int i=1;i<=q;i++)
{
int x,y;
cin>>x>>y;
int ans=d[x]+d[y]-2*d[lca(x,y)];
for(int j=1;j<=cnt;j++) ans=min(ans,d_42[j][x]+d_42[j][y]);
cout<<ans<<endl;
}
}