#include <bits/stdc++.h> // NeOWami
using namespace std;
#define ft first
#define sc second
struct Dinic {
struct Edge {
int v, rev;
long long cap, flow;
};
long long INF = 4e18;
int N;
vector<vector<Edge>> G;
vector<int> level, curEdge;
Dinic (int n = 0) {
init(n);
};
void init(int n) {
N = n;
G.assign(n, {});
}
void addEdge(int u, int v, long long cap) {
Edge a{v, (int)G[v].size(), cap, 0};
Edge b{u, (int)G[u].size(), 0, 0};
G[u].push_back(a);
G[v].push_back(b);
}
bool bfs(int s, int t) {
level.assign(N, -1);
level[s] = 0;
queue<int> Q;
Q.push(s);
while(!Q.empty() && level[t] == -1) {
int u = Q.front(); Q.pop();
for (Edge &e: G[u]) {
if (e.cap > e.flow && level[e.v] == -1) {
level[e.v] = level[u] + 1;
Q.push(e.v);
}
}
}
return level[t] != -1;
}
long long dfs(int u, int t, long long f) {
if (!f || u == t) return f;
for (int &i = curEdge[u]; i < (int)G[u].size(); i++) {
Edge &e = G[u][i];
if (e.cap > e.flow && level[e.v] == level[u] + 1) {
long long val = dfs(e.v, t, min(f, e.cap - e.flow));
if (val) {
e.flow += val;
G[e.v][e.rev].flow -= val;
return val;
}
}
}
return 0;
}
long long maxFlow(int s, int t) {
long long flow = 0;
while(bfs(s, t)) {
curEdge.assign(N, 0);
while(long long f = dfs(s, t, INF)) {
flow += f;
}
}
return flow;
}
};
signed main() {
cin.tie(NULL)->sync_with_stdio(false);
if(ifstream("Input.inp")) {
freopen("Input.inp", "r", stdin);
freopen("Output.out", "w", stdout);
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+IC8vIE5lT1dhbWkKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCiNkZWZpbmUgZnQgZmlyc3QKI2RlZmluZSBzYyBzZWNvbmQKCnN0cnVjdCBEaW5pYyB7CiAgICBzdHJ1Y3QgRWRnZSB7CiAgICAgICAgaW50IHYsIHJldjsKICAgICAgICBsb25nIGxvbmcgY2FwLCBmbG93OwogICAgfTsKICAgIGxvbmcgbG9uZyBJTkYgPSA0ZTE4OwogICAgaW50IE47CiAgICB2ZWN0b3I8dmVjdG9yPEVkZ2U+PiBHOwogICAgdmVjdG9yPGludD4gbGV2ZWwsIGN1ckVkZ2U7CiAgICBEaW5pYyAoaW50IG4gPSAwKSB7CiAgICAgICAgaW5pdChuKTsKICAgIH07CiAgICB2b2lkIGluaXQoaW50IG4pIHsKICAgICAgICBOID0gbjsKICAgICAgICBHLmFzc2lnbihuLCB7fSk7CiAgICB9CiAgICB2b2lkIGFkZEVkZ2UoaW50IHUsIGludCB2LCBsb25nIGxvbmcgY2FwKSB7CiAgICAgICAgRWRnZSBhe3YsIChpbnQpR1t2XS5zaXplKCksIGNhcCwgMH07CiAgICAgICAgRWRnZSBie3UsIChpbnQpR1t1XS5zaXplKCksIDAsIDB9OwogICAgICAgIEdbdV0ucHVzaF9iYWNrKGEpOwogICAgICAgIEdbdl0ucHVzaF9iYWNrKGIpOwogICAgfQoKICAgIGJvb2wgYmZzKGludCBzLCBpbnQgdCkgewogICAgICAgIGxldmVsLmFzc2lnbihOLCAtMSk7CiAgICAgICAgbGV2ZWxbc10gPSAwOwogICAgICAgIHF1ZXVlPGludD4gUTsKICAgICAgICBRLnB1c2gocyk7CiAgICAgICAgCiAgICAgICAgd2hpbGUoIVEuZW1wdHkoKSAmJiBsZXZlbFt0XSA9PSAtMSkgewogICAgICAgICAgICBpbnQgdSA9IFEuZnJvbnQoKTsgUS5wb3AoKTsKICAgICAgICAgICAgZm9yIChFZGdlICZlOiBHW3VdKSB7CiAgICAgICAgICAgICAgICBpZiAoZS5jYXAgPiBlLmZsb3cgJiYgbGV2ZWxbZS52XSA9PSAtMSkgewogICAgICAgICAgICAgICAgICAgIGxldmVsW2Uudl0gPSBsZXZlbFt1XSArIDE7CiAgICAgICAgICAgICAgICAgICAgUS5wdXNoKGUudik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGxldmVsW3RdICE9IC0xOwogICAgfQogICAgbG9uZyBsb25nIGRmcyhpbnQgdSwgaW50IHQsIGxvbmcgbG9uZyBmKSB7CiAgICAgICAgaWYgKCFmIHx8IHUgPT0gdCkgcmV0dXJuIGY7CiAgICAgICAgZm9yIChpbnQgJmkgPSBjdXJFZGdlW3VdOyBpIDwgKGludClHW3VdLnNpemUoKTsgaSsrKSB7CiAgICAgICAgICAgIEVkZ2UgJmUgPSBHW3VdW2ldOwogICAgICAgICAgICBpZiAoZS5jYXAgPiBlLmZsb3cgJiYgbGV2ZWxbZS52XSA9PSBsZXZlbFt1XSArIDEpIHsKICAgICAgICAgICAgICAgIGxvbmcgbG9uZyB2YWwgPSBkZnMoZS52LCB0LCBtaW4oZiwgZS5jYXAgLSBlLmZsb3cpKTsKICAgICAgICAgICAgICAgIGlmICh2YWwpIHsKICAgICAgICAgICAgICAgICAgICBlLmZsb3cgKz0gdmFsOwogICAgICAgICAgICAgICAgICAgIEdbZS52XVtlLnJldl0uZmxvdyAtPSB2YWw7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gMDsKICAgIH0KICAgIGxvbmcgbG9uZyBtYXhGbG93KGludCBzLCBpbnQgdCkgewogICAgICAgIGxvbmcgbG9uZyBmbG93ID0gMDsKICAgICAgICB3aGlsZShiZnMocywgdCkpIHsKICAgICAgICAgICAgY3VyRWRnZS5hc3NpZ24oTiwgMCk7CiAgICAgICAgICAgIHdoaWxlKGxvbmcgbG9uZyBmID0gZGZzKHMsIHQsIElORikpIHsKICAgICAgICAgICAgICAgIGZsb3cgKz0gZjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gZmxvdzsKICAgIH0KfTsKc2lnbmVkIG1haW4oKSB7CiAgICBjaW4udGllKE5VTEwpLT5zeW5jX3dpdGhfc3RkaW8oZmFsc2UpOwogICAgaWYoaWZzdHJlYW0oIklucHV0LmlucCIpKSB7CiAgICAgICAgZnJlb3BlbigiSW5wdXQuaW5wIiwgInIiLCBzdGRpbik7CiAgICAgICAgZnJlb3BlbigiT3V0cHV0Lm91dCIsICJ3Iiwgc3Rkb3V0KTsKICAgIH0KICAgIAogICAgcmV0dXJuIDA7Cn0=