using System; using static System.Console; using System.Linq; using System.Collections.Generic; using System.Security.Cryptography; class Program { static int NN => int.Parse(ReadLine()); static int[] NList => ReadLine().Split().Select(int.Parse).ToArray(); static int[][] NArr(long n) => Enumerable.Repeat(0, (int)n).Select(_ => NList).ToArray(); public static void Main() { Solve(); } static void Solve() { var c = NArr(5); var ox = new int[] { 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 4, 4, 4 }; var oy = new int[] { 1, 2, 3, 4, 0, 4, 0, 4, 0, 4, 0, 1, 2, 3, 4 }; var ix = new int[] { 1, 1, 1, 2, 2, 2, 3, 3, 3 }; var iy = new int[] { 1, 2, 3, 1, 2, 3, 1, 2, 3 }; var ans = INF; var bitmax = 512; { for (var b = 0; b < bitmax; ++b) { var div = new bool[5, 5]; for (var i = 0; i < 9; ++i) { if (((b >> i) & 1) != 0) div[ix[i], iy[i]] = true; } ans = Math.Min(ans, Divide(c, div)); } } for (var of = 0; of < ox.Length; ++of) { for (var ot = of; ot < ox.Length; ++ot) { var div = new bool[5, 5]; for (var i = of; i <= ot; ++i) div[ox[i], oy[i]] = true; for (var b = 0; b < bitmax; ++b) { for (var i = 0; i < 9; ++i) { if (((b >> i) & 1) != 0) div[ix[i], iy[i]] = true; } ans = Math.Min(ans, Divide(c, div)); } } } WriteLine(ans); } static long INF = long.MaxValue; static long Divide(int[][] c, bool[,] div) { var uf = new UnionFindTree(25); for (var i = 0; i < 5; ++i) for (var j = 0; j < 4; ++j) if (div[i, j] == div[i, j + 1]) uf.Unite(i * 5 + j, i * 5 + j + 1); for (var i = 0; i < 4; ++i) for (var j = 0; j < 5; ++j) if (div[i, j] == div[i + 1, j]) uf.Unite(i * 5 + j, i * 5 + j + 5); var sum = new long[25]; var one = -1; var two = -1; for (var i = 0; i < 25; ++i) { var r = uf.GetRoot(i); if (one != r && two != r) { if (one < 0) one = r; else if (two < 0) two = r; else return INF; } sum[r] += c[i / 5][i % 5]; } if (two < 0) return sum[one]; else return Math.Abs(sum[one] - sum[two]); } class UnionFindTree { int[] roots; public UnionFindTree(int size) { roots = new int[size]; for (var i = 0; i < size; ++i) roots[i] = -1; } public int GetRoot(int a) { if (roots[a] < 0) return a; return roots[a] = GetRoot(roots[a]); } public bool IsSameTree(int a, int b) { return GetRoot(a) == GetRoot(b); } public bool Unite(int a, int b) { var x = GetRoot(a); var y = GetRoot(b); if (x == y) return false; if (-roots[x] < -roots[y]) { var tmp = x; x = y; y = tmp; } roots[x] += roots[y]; roots[y] = x; return true; } public int GetSize(int a) { return -roots[GetRoot(a)]; } } }