#include <iostream>
#include <vector>
#include <set>
#include "Azer.h"
#include "Baijan.h"
using namespace std;
const int MA = 1<<12;
vector<pair<int, int>> neiA[MA];
vector<int> v1A, v2A, v3A, inpA, Final;
int Na, A, typeA, inpSA, szA, KA, numA;
void Asends(int val){
for (int i=10;i+1;i--){
SendA(!!(val & (1<<i)));
}
}
void InitA(int n, int a, vector<int> u, vector<int> v, vector<int> c){
Na = n,A = a;
v1A = u, v2A = v, v3A = c;
if (A <= 300){
typeA = 1;
Asends(1);
Asends(A * 3);
for (int i=0;i<A;i++)
Asends(u[i]), Asends(v[i]), Asends(c[i]);
}
else{
typeA = 2;
Asends(2);
Asends(0);
}
}
vector<int> dikstraA(){
vector<int> Ans(Na, 1e9);
Ans[0] = 0;
set<pair<int, int>> st = {{0, 0}};
while (st.size() > 0){
auto [mn, u] = *begin(st);
st.erase(begin(st));
if (mn != Ans[u])
continue;
for (auto [i, w] : neiA[u]){
if (Ans[i] > Ans[u] + w){
Ans[i] = Ans[u] + w;
st.insert({Ans[i], i});
}
}
}
return Ans;
}
void prepareAns(){
if (typeA == 1){
for (int i=0;i<Na+Na;i+=2)
Final.push_back((inpA[i]<<11) + inpA[i+1]);
return;
}
for (int i=0;i<A;i++){
neiA[v1A[i]].push_back({v2A[i], v3A[i]});
neiA[v2A[i]].push_back({v1A[i], v3A[i]});
}
for (int i=0;i<inpSA;i+=3){
neiA[inpA[i]].push_back({inpA[i+1], inpA[i+2]});
neiA[inpA[i+1]].push_back({inpA[i], inpA[i+2]});
}
Final = dikstraA();
}
void ReceiveA(bool b){
numA = numA * 2 + b, szA++;
if (szA == 11){
KA++;
if (KA == 1)
inpSA = numA;
if (KA > 1)
inpA.push_back(numA);
numA = 0, szA = 0;
if (KA >= 1 and KA == inpSA + 1)
prepareAns();
}
}
vector<int> Answer(){
return Final;
}
#include <iostream>
#include <vector>
#include <set>
#include "Azer.h"
#include "Baijan.h"
using namespace std;
const int M = 1<<12;
vector<pair<int, int>> nei[M];
vector<int> v1, v2, v3, inp;
int N, B, type, inpS, sz, K, num;
void Bsends(int val){
for (int i=10;i+1;i--){
SendB(!!(val & (1<<i)));
}
}
void InitB(int n, int b, vector<int> u, vector<int> v, vector<int> c){
N = n, B = b;
v1 = u, v2 = v, v3 = c;
}
vector<int> dikstra(){
vector<int> Ans(N, 1e9);
Ans[0] = 0;
set<pair<int, int>> st = {{0, 0}};
while (st.size() > 0){
auto [mn, u] = *begin(st);
st.erase(begin(st));
if (mn != Ans[u])
continue;
for (auto [i, w] : nei[u]){
if (Ans[i] > Ans[u] + w){
Ans[i] = Ans[u] + w;
st.insert({Ans[i], i});
}
}
}
return Ans;
}
void prepareAnsA(){
if (type == 2){
Bsends(B * 3);
for (int i=0;i<B;i++)
Bsends(v1[i]), Bsends(v2[i]), Bsends(v3[i]);
return;
}
for (int i=0;i<B;i++){
nei[v1[i]].push_back({v2[i], v3[i]});
nei[v2[i]].push_back({v1[i], v3[i]});
}
for (int i=0;i<inpS;i+=3){
nei[inp[i]].push_back({inp[i+1], inp[i+2]});
nei[inp[i+1]].push_back({inp[i], inp[i+2]});
}
vector<int> Ans = dikstra();
Bsends(N * 2);
for (int i : Ans){
Bsends((4192256 & i)>>11);
Bsends(2047 & i);
}
return;
}
void ReceiveB(bool b){
num = num * 2 + b, sz++;
if (sz == 11){
K++;
if (K == 1){
type = num;
}
if (K == 2)
inpS = num;
if (K > 2)
inp.push_back(num);
num = 0, sz = 0;
if (K >= 2 and K == inpS + 2)
prepareAnsA();
}
}