#include <bits/stdc++.h>
using namespace std;
const int INF = 1e9;
const int N = 10, M = N * N / 2;
int p[7] = {0, 3, 9, 12, 5, 18, 4};
int h[N], ne[M], e[M], w[M], idx;
int dist[N];
int n;
void add(int a,int b,int c)
{
e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx++;
}
void build(int S6)
{
memset(h,-1,sizeof h);
idx = 0;
add(0, 6, S6), add(6, 0, -S6);
for(int i = 2; i <= 6; i ++) add(i - 2, i, p[i]);
for(int i = 1; i <= 1; i ++) add(4 + i, i, p[i] - S6);
for(int i = 1; i <= 6; i ++) add(i - 1, i, 0);
}
bool spfa(int c)
{ //求最长路,判断正环
queue<int> q;
vector<bool> st(N, false);
vector<int> cnt(N, 0);
memset(dist, -0x3f, sizeof dist);
build(c);
//差分约束从源点出发
q.push(0);
st[0] = true;
dist[0] = 0;
while(q.size())
{
int t = q.front();
q.pop();
st[t] = false;
for(int i = h[t]; i != -1; i = ne[i])
{
int j = e[i];
if(dist[j] < dist[t] + w[i])
{
dist[j] = dist[t] + w[i];
cnt[j] = cnt[t] + 1;
if(cnt[j] >= 7) return false;
if(!st[j])
{
q.push(j);
st[j] = true;
}
}
}
}
return true;
}
int main()
{
int l = 0, r = INF;
while (l < r)
{
int mid = l + r >> 1;
if (spfa(mid)) r = mid;
else l = mid + 1;
}
if (r == INF) cout << "No Solution!" << endl;
else cout << l << endl;
return 0;
}