#include<bits/stdc++.h>
using namespace std;
const int inf=0x7fffff;
int dis[101],check[101];
int graph[101][101];
int n,m;
void dijkstra(int s){//输入起点
for(int i=1;i<=n;i++){
dis[i]=inf;
check[i]=0;
}//初始化
dis[s]=0;
for(int i=1;i<=n;i++){
int minn=inf,minx;
for(int j=1;j<=n;j++){
if(dis[j]<minn&&check[j]==0){
minn=dis[j];
minx=j;
}
}
check[minx]=1;
for(int j=1;j<=n;j++){
if(graph[minx][j]>0&&minn+graph[minx][j]<dis[j]){
dis[j]=minn+graph[minx][j];
}
}
}
}
int main(){
int q,k=0;
int u,v;
int mindis[5001];
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
graph[i][j]=-1;
}
}
for(int i=0;i<m;i++){
scanf("%d",&q);
if(q==1){
int e;
scanf("%d%d%d",&u,&v,&e);
if(graph[u][v]>e||graph[u][v]==-1){
graph[u][v]=e;
graph[v][u]=e;
}
}
else if(q==0){
scanf("%d%d",&u,&v);
dijkstra(u);
if(dis[v]==inf)mindis[k++]=-1;
else mindis[k++]=dis[v];
}
}
for(int i=0;i<k;i++){
printf("%d\n",mindis[i]);
}
}