#include "Baijan.h"
#include <bits/stdc++.h>
using namespace std;
namespace {
const int BLOCK = 0;
const int maxn = 2000;
const int inf = 1123123123;
int n, m, reb;
int d[maxn];
vector < pair < int, int > > g[maxn];
vector < bool > rec2;
void dijkstra(int s){
set < pair < int, int > > q;
fill(d, d + maxn, inf);
d[s] = 0, q.insert({d[s], s});
while(!q.empty()){
int v = (q.begin() -> second);
q.erase(q.begin());
for(auto [u, w] : g[v])
if(d[v] + w < d[u])
q.erase({d[u], u}),
d[u] = d[v] + w,
q.insert({d[u], u});
}
}
}
void InitB(int N, int B, std::vector<int> S, std::vector<int> T, std::vector<int> D) {
n = N, reb = B, m = n - reb - 1;
int j = 0;
for(int i = 0; i < B; i++)
g[S[i]].push_back({T[i], D[i]}),
g[T[i]].push_back({S[i], D[i]});
if(m >= BLOCK){
for(int i = 0; i < reb; i++){
for(int bit = 10; bit >= 0; bit--) SendB((S[i] >> bit & 1));
for(int bit = 10; bit >= 0; bit--) SendB((T[i] >> bit & 1));
for(int bit = 8; bit >= 0; bit--) SendB((D[i] >> bit & 1));
}
}
}
void ReceiveB(bool y) {
rec2.push_back(y);
if(m < BLOCK && rec2.size() == 31 * m){
int j = 0;
for(int i = 0; i < m; i++){
int u = 0, v = 0, c = 0;
for(int bit = 10; bit >= 0; bit--) u |= (rec2[j++] << bit);
for(int bit = 10; bit >= 0; bit--) v |= (rec2[j++] << bit);
for(int bit = 8; bit >= 0; bit--) c |= (rec2[j++] << bit);
g[u].push_back({v, c});
g[v].push_back({u, c});
}
dijkstra(0);
for(int i = 0; i < n; i++)
for(int bit = 19; bit >= 0; bit--)
SendB((d[i] >> bit & 1));
}
}
#include "Baijan.h"
#include <bits/stdc++.h>
using namespace std;
namespace {
const int maxn = 2000;
const int inf = 1123123123;
int n, m, reb;
int d[maxn];
vector < pair < int, int > > g[maxn];
vector < bool > rec2;
void dijkstra(int s){
set < pair < int, int > > q;
fill(d, d + maxn, inf);
d[s] = 0, q.insert({d[s], s});
while(!q.empty()){
int v = (q.begin() -> second);
q.erase(q.begin());
for(auto [u, w] : g[v])
if(d[v] + w < d[u])
q.erase({d[u], u}),
d[u] = d[v] + w,
q.insert({d[u], u});
}
}
}
void InitB(int N, int B, std::vector<int> S, std::vector<int> T, std::vector<int> D) {
n = N, reb = B, m = n - reb - 1;
int j = 0;
for(int i = 0; i < B; i++)
g[S[i]].push_back({T[i], D[i]}),
g[T[i]].push_back({S[i], D[i]});
if(m >= 500){
for(int i = 0; i < reb; i++){
for(int bit = 10; bit >= 0; bit--) SendB((S[i] >> bit & 1));
for(int bit = 10; bit >= 0; bit--) SendB((T[i] >> bit & 1));
for(int bit = 8; bit >= 0; bit--) SendB((D[i] >> bit & 1));
}
}
}
void ReceiveB(bool y) {
rec2.push_back(y);
if(m < 500 && rec2.size() == 31 * m){
int j = 0;
for(int i = 0; i < m; i++){
int u = 0, v = 0, c = 0;
for(int bit = 10; bit >= 0; bit--) u |= (rec2[j++] << bit);
for(int bit = 10; bit >= 0; bit--) v |= (rec2[j++] << bit);
for(int bit = 8; bit >= 0; bit--) c |= (rec2[j++] << bit);
g[u].push_back({v, c});
g[v].push_back({u, c});
}
dijkstra(0);
for(int i = 0; i < n; i++)
for(int bit = 19; bit >= 0; bit--)
SendB((d[i] >> bit & 1));
}
}