#include<bits/stdc++.h>
using namespace std;
const int INF=1e6;
int N,M;
int G[110][110];
bool vis[110]={false};
int d[110];
void dj(int s){
fill(d,d+N+1,INF);
d[s]=0;
for(int i=1;i<=N;i++){
int u=-1,min=INF;
for(int j=1;j<=N;j++){
if(vis[j]==false&&d[j]<min){
u=j;
min=d[j];
}
}
if(u==-1) return ;
vis[u]=true;
for(int v=1;v<=N;v++){
if(vis[v]==false&&G[u][v]!=INF&&d[u]+G[u][v]<d[v]){
d[v]=G[u][v]+d[u];
}
}
}
}
int main(){
cin>>N>>M;
fill(G[1],G[1]+110*110,INF);
for(int i=0;i<M;i++){
int ch;
cin>>ch;
if(ch==1){
int x1,y1,z1;
cin>>x1>>y1>>z1;
if(z1<G[x1][y1]){
G[x1][y1]=G[y1][x1]=z1;
}
}
if(ch==0){
int start,end;
cin>>start>>end;
dj(start);
if(d[end]!=INF)cout<<d[end];
else cout<<"-1"<<endl;
}
}
return 0;
}