#include <cstdio>
#include <algorithm>

using namespace std;

const int MAX_N=1E2,MAX_K=5*1E3;
const int INF=2*1E8;

int n,k;

int G[MAX_N][MAX_N];
int d[MAX_N];

bool used[MAX_N];

int dijkstra(int s,int g){
	fill(used,used+n,false);
	fill(d,d+n,INF);
	d[s]=0;
	while (1){
		int v=-1;
		for (int i=0;i<n;i++){
			if (!used[i] && (v==-1 || d[i]<d[v])){
				v=i;
			}
		}
		if (v==g) break;
		used[v]=true;
		for (int i=0;i<n;i++){
			d[i]=min(d[i],d[v]+G[v][i]);
		}
	}
	return d[g];
}

int main(){
	do{
		scanf("%d %d",&n,&k);
		if (n || k){
			for (int i=0;i<n;i++){
				for (int j=0;j<n;j++){
					G[i][j]=INF;
				}
			}
			for (int i=0;i<k;i++){
				int t;
				scanf("%d",&t);
				if (t==0){
					int a,b;
					scanf("%d %d",&a,&b);
					int dist=dijkstra(a-1,b-1);
					printf("%d\n",dist==INF ? -1 : dist);
				}
				else{
					int c,d,e;
					scanf("%d %d %d",&c,&d,&e);
					c--;
					d--;
					G[c][d]=min(G[c][d],e);
					G[d][c]=min(G[d][c],e);
				}
			}
		}
	}while (n || k);
	return 0;
}