#include <bits/stdc++.h>
using namespace std;
const int MAXV=1010;
int n,m;
long long d[MAXV];
const int INF=1000000;
int pre[MAXV];
bool visit[MAXV];
long long G[MAXV][MAXV];
void dijkstra(int s){
fill(d,d+MAXV,INF);
d[s]=0;
for(int i=1;i<=n;i++){
int u=-1,MIN=INF;
for(int j=1;j<=n;j++){
if(visit[j]==false&&d[j]<MIN){
u=j;
MIN=d[j];
}
}
if(u==-1) return;
visit[u]=true;
for(int v=1;v<=n;v++){
if(visit[v]==false&&d[u]+G[v][u]<d[v]&&G[u][v]!=INF){
d[v]=d[u]+G[u][v];
}
}
}
}
int main(){
cin>>n>>m;
fill(G[0],G[0]+MAXV*MAXV,INF);
for(int i=0;i<m;i++){
int k;
cin>>k;
if(k==0){
int st,ed;
cin>>st>>ed;
fill(visit,visit+MAXV,false);
dijkstra(st);
if(d[ed]!=INF)
cout<<d[ed]<<endl;
else
cout<<-1<<endl;
}
if(k==1){
int u,v,w;
cin>>u>>v>>w;
if(w<G[u][v]){
G[u][v]=w;
G[v][u]=w;
}}
}
}