//Floyd算法,输出点x到y的最小距离
#include<iostream>
using namespace std;
const int maxn=10001,maxm=1000001;
#define zhf 100000000
int d[maxn][maxn],a[maxn][maxn],p[maxn];
int main(){
int i,j,k,m,n;
cin>>n>>m;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(i!=j)d[i][j]=d[j][i]=zhf;
for(i=1;i<=m;i++){
int x,y,z;
cin>>x>>y>>z;
d[x][y]=d[y][x]=z;
}
for(k=1;k<=n;k++)
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(d[i][j]>d[i][k]+d[k][j])
d[i][j]=d[i][k]+d[k][j];
int x,y;
while(cin>>x>>y){
cout<<d[x][y]<<endl;
}
return 0;
}
#include<iostream>
using namespace std;
const int maxn=10001,maxm=1000001;
#define zhf 100000000
int d[maxn][maxn],a[maxn][maxn],p[maxn];
int main(){
int i,j,k,m,n;
cin>>n>>m;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(i!=j)d[i][j]=d[j][i]=zhf;
for(i=1;i<=m;i++){
int x,y,z;
cin>>x>>y>>z;
d[x][y]=d[y][x]=z;
}
for(k=1;k<=n;k++)
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(d[i][j]>d[i][k]+d[k][j])
d[i][j]=d[i][k]+d[k][j];
int x,y;
while(cin>>x>>y){
cout<<d[x][y]<<endl;
}
return 0;
}