1 #include<algorithm>
2 #include<cstdio>
3 #include<iostream>
4 #include<queue>
5 #include<vector>
6 #include<map>
7 #include<stack>
8 #include<string>
9 #include<cmath>
10 #include<sstream>
11 #include<cstring>
12 #include<set>
13 using namespace std;
14 typedef long long int ll;
15 typedef unsigned long long int ull;
16 inline int rd() {
17 int X = 0, w = 0;char ch = 0;while (!isdigit(ch)) { w |= ch == '-';ch = getchar(); }
18 while (isdigit(ch)) X = (X << 3) + (X << 1) + (ch ^ 48), ch = getchar();return w ? -X : X;
19 }
20 inline ll lrd() {
21 ll X = 0, w = 0;char ch = 0;while (!isdigit(ch)) { w |= ch == '-';ch = getchar(); }
22 while (isdigit(ch)) X = (X << 3) + (X << 1) + (ch ^ 48), ch = getchar();return w ? -X : X;
23 }
24 #define bug puts("DEBUG*******************************")
25 #define in(a) int n = rd()
26 #define pi acos(-1)
27 #define pb push_back
28 #define rep(i,a,n) for(int i=a;i<=n;++i)
29 #define per(i,a,n) for(int i=a;i>=n;--i)
30 #define sld(n) scanf("%lld",&n)
31 #define sldd(n,m) scanf("%lld %lld",&n,&m)
32 #define pd(n) printf("%d\n",n)
33 #define pld(n) printf("%lld\n",n)
34 #define mem(a,b) memset(a,b,sizeof a)
35 #define Case(T) int T=rd();while (T--)
36 #pragma comment(linker, "/STACK:102400000,102400000")
37 const double eps = 1e-8;
38 const int inf = 0x3f3f3f3f;
39 const ll INF = 0x3f3f3f3f3f3f3f3f;
40 const int MOD = 1e5 + 7;
41 const int maxn = 5e4+10;
42 bool vis[maxn<<2];
43 ll dis[maxn<<2];
44 int tot;
45 int rt1[maxn << 2], rt2[maxn << 2];
46 struct edge {
47 int from, to;
48 ll w;
49 edge() {}
50 edge(int from, int to, ll w) :from(from), to(to), w(w) {}
51 };
52 vector<edge>e[maxn<<2];
53 struct node {
54 int id;
55 ll n_dis;
56 node() {}
57 node(int id, ll n_dis) :id(id), n_dis(n_dis) {}
58 bool operator<(const node& a)const { return n_dis > a.n_dis; }
59 };
60 void build(int rt, int l, int r, int op) {
61 if (!op)rt1[rt] = ++tot;
62 else rt2[rt] = ++tot;
63 rep(i, l, r) {
64 if (!op)e[tot].pb({ tot,i,0 });
65 else e[i].pb({ i,tot,0 });
66 }
67 if (l == r)return;
68 int mid = l + r >> 1;
69 build(rt << 1, l, mid, op);
70 build(rt << 1|1, mid+1, r, op);
71 }
72 void update(int rt, int l, int r, int u, int L, int R, ll w, int op) {
73 if (L <= l && R >= r) {
74 if (op==2) {
75 e[rt2[rt]].pb({ rt2[rt],u,w });
76 }
77 else {
78 e[u].pb({ u,rt1[rt],w });
79 }
80 return;
81 }
82 int mid = l + r >> 1;
83 if (L <= mid) update(rt << 1, l, mid, u, L, R, w, op);
84 if (R > mid) update(rt << 1 | 1, mid + 1, r, u, L, R, w, op);
85 }
86 void dij(int s) {
87 for (int i = 1;i < maxn;i++)dis[i] = INF, vis[i] = false;
88 dis[s] = 0;
89 priority_queue<node>Q;
90 Q.push(node{ s,dis[s] });
91 while (!Q.empty()) {
92 node u = Q.top();
93 Q.pop();
94 if (vis[u.id])continue;
95 vis[u.id] = true;
96 int len = e[u.id].size();
97 for (int i = 0;i < len;i++) {
98 edge y = e[u.id][i];
99 if (vis[y.to])continue;
100 if (dis[y.to] > y.w + u.n_dis) {
101 dis[y.to] = y.w + u.n_dis;
102 Q.push({ y.to,dis[y.to] });
103 }
104 }
105 }
106 }
107 int main() {
108 int n = rd(), m = rd();
109 while (m--) {
110 int u = rd(), v = rd();
111 ll w = rd();
112 e[u].pb({ u,v,w });
113 }
114 tot = n;
115 build(1, 1, n, 0);
116 build(1, 1, n, 1);
117 int q = rd();
118 while (q--) {
119 int op = rd();
120 if (op == 1) {
121 int u = rd(), l = rd(), r = rd();
122 ll w = lrd();
123 update(1, 1, n, u, l, r, w, op);
124 }
125 else {
126 int l = rd(), r = rd(), u = rd();
127 ll w = lrd();
128 update(1, 1, n, u, l, r, w, op);
129 }
130 }
131 dij(1);
132 rep(i, 1, n) {
133 if (dis[i] == INF)puts("-1");
134 else pld(dis[i]);
135 }
136 }