#include <iostream>
#include <vector>
#include <algorithm>
#include <map>
#include <queue>
#include <cstdio>
#include <ctime>
#include <assert.h>
#include <chrono>
#include <random>
#include <numeric>
#include <set>
#include <deque>
#include <stack>
#include <bitset>
using namespace std;
typedef long long int ll;
typedef unsigned long long ull;

mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
ll myRand(ll B) {
    return (ull)rng() % B;
}

int d[101][101];

int main(){
	cin.tie(nullptr);
	ios::sync_with_stdio(false);
	while(1){
		int n,m; cin >> n >> m;
		if(!n&&!m)break;
		for(int i=0;i<n;i++){
			for(int j=0;j<n;j++){
				if(i!=j)d[i][j]=1e9;
			}
		}
		for(int i=0;i<m;i++){
			int t; cin >> t;
			if(!t){
				int x,y; cin >> x >> y;
				x--; y--;
				if(d[x][y]==1e9)printf("-1\n");
				else printf("%d\n",d[x][y]);
			}
			else{
				int x,y,z; cin >> x >> y >> z;
				x--; y--;
				for(int j=0;j<n;j++){
					for(int k=0;k<n;k++){
						d[j][k]=d[k][j]=min(d[j][k],z+min(d[j][x]+d[y][k],d[j][y]+d[k][x]));
					}
				}
			}
		}
	}
}
