#include <bits/stdc++.h>
#define ll long long
#define el cout << endl
#define BIT(n) ((1ll) << (n))
#define bit(mask, i) (((mask) >> (i)) & 1)
using namespace std;
void encode_bit(int b);
namespace ENCODER
{
const int maxn = 1e3;
const int maxh = 36;
const int maxlog = __lg(maxn);
int dist[maxh + 10][maxn + 10], n, h, par[maxh + 10][maxn + 10];
vector<int> adj[maxn + 10];
void bfs(int source)
{
for (int i = 0; i < n; i++)
dist[source][i] = -1;
queue<int> q;
dist[source][source] = 0;
q.push(source);
while (q.size())
{
int top = q.front();
q.pop();
for (int next_top : adj[top])
{
if (dist[source][next_top] != -1)
continue;
dist[source][next_top] = dist[source][top] + 1;
par[source][next_top] = top;
q.push(next_top);
}
}
}
void encode(int _N, int _H, int P, int A[], int B[])
{
n = _N;
h = _H;
for (int i = 0; i < P; i++)
{
adj[A[i]].push_back(B[i]);
adj[B[i]].push_back(A[i]);
}
for (int i = 0; i < h; i++)
{
bfs(i);
for (int j = 0; j < n; j++)
{
if (i == j)
continue;
// cout << i << ' ' << par[i][j] << ' ' << j, el;
for (int k = maxlog; k >= 0; k--)
encode_bit(bit(par[i][j], k));
}
}
}
}
void encode(int _N, int _H, int P, int A[], int B[])
{
ENCODER::encode(_N, _H, P, A, B);
}
#include <bits/stdc++.h>
#define ll long long
#define el cout << endl
#define BIT(n) ((1ll) << (n))
#define bit(mask, i) (((mask) >> (i)) & 1)
using namespace std;
int decode_bit();
void hops(int h, int c, int d);
namespace DECODER
{
const int maxn = 1e3;
const int maxh = 36;
const int maxlog = __lg(maxn);
int n, h, dist[maxn + 10];
vector<int> adj[maxn + 10];
void dfs(int top)
{
for (int next_top : adj[top])
{
dist[next_top] = dist[top] + 1;
dfs(next_top);
}
}
void decode(int _N, int _H)
{
n = _N;
h = _H;
for (int x = 0; x < h; x++)
{
for (int i = 0; i < n; i++)
adj[i].clear();
for (int i = 0; i < n; i++)
{
if (i == x)
continue;
int y = 0;
for (int j = maxlog; j >= 0; j--)
y += BIT(j) * decode_bit();
if (y == i)
continue;
// cout << x << ' ' << y << ' ' << i, el;
adj[y].push_back(i);
}
dist[x] = 0;
dfs(x);
for (int i = 0; i < n; i++)
hops(x, i, dist[i]);
}
}
}
void decode(int _N, int _H)
{
DECODER::decode(_N, _H);
}