# Haskellwhores sosnooley.
# No need to handle special cases like 'Nothing'.
inf = float('inf')
def yoba(map, start, end):
# Haskellwhores sosnooley again.
# 'bounds'? Hah.
w = len(map)
h = w and len(map[0])
# And again. This lambda was borrowed from the Reifag's code.
value = lambda x, y: 0 if y == start \
else inf if not x \
else min(arr[x - 1][n] + map[n][y] for n in range(h))
# Pythonwhores sosnooley.
# Much more readable variant:
# arr = [[value(x, y) for y in range(h)] for x in range(w)]
# Unfortunately, it does not work because value() tries to access
# the arr list.
arr = []
for x in range(w): arr.append([value(x, y) for y in range(h)])
return min(arr[x][end] for x in range(w))
rank = 10 ** 10000
if __name__ == '__main__':
# Haskellwhores sosnooley again.
toArray2D = lambda arr: list(zip(*arr))
graph = [[inf, 7 * rank, 9 * rank, inf, inf, 14 * rank],
[ 7 * rank, inf, 10 * rank, 15 * rank, inf, inf],
[ 9 * rank, 10 * rank, inf, 11 * rank, inf, 2 * rank],
[inf, 15 * rank, 11 * rank, inf, 6 * rank, inf],
[inf, inf, inf, 6 * rank, inf, 9 * rank],
[ 14 * rank, inf, 2 * rank, inf, 9 * rank, inf]]
print(yoba(toArray2D(graph), 0, 4))
IyBIYXNrZWxsd2hvcmVzIHNvc25vb2xleS4KIyBObyBuZWVkIHRvIGhhbmRsZSBzcGVjaWFsIGNhc2VzIGxpa2UgJ05vdGhpbmcnLgppbmYgPSBmbG9hdCgnaW5mJykKCgpkZWYgeW9iYShtYXAsIHN0YXJ0LCBlbmQpOgogICAgIyBIYXNrZWxsd2hvcmVzIHNvc25vb2xleSBhZ2Fpbi4KICAgICMgJ2JvdW5kcyc/IEhhaC4KICAgIHcgPSBsZW4obWFwKQogICAgaCA9IHcgYW5kIGxlbihtYXBbMF0pCiAgICAjIEFuZCBhZ2Fpbi4gIFRoaXMgbGFtYmRhIHdhcyBib3Jyb3dlZCBmcm9tIHRoZSBSZWlmYWcncyBjb2RlLgogICAgdmFsdWUgPSBsYW1iZGEgeCwgeTogMCAgICBpZiB5ID09IHN0YXJ0IFwKICAgICAgICAgICAgICAgICAgICBlbHNlIGluZiAgaWYgbm90IHggICAgICBcCiAgICAgICAgICAgICAgICAgICAgZWxzZSBtaW4oYXJyW3ggLSAxXVtuXSArIG1hcFtuXVt5XSBmb3IgbiBpbiByYW5nZShoKSkKCiAgICAjIFB5dGhvbndob3JlcyBzb3Nub29sZXkuCiAgICAjIE11Y2ggbW9yZSByZWFkYWJsZSB2YXJpYW50OgogICAgIyAgICBhcnIgPSBbW3ZhbHVlKHgsIHkpIGZvciB5IGluIHJhbmdlKGgpXSBmb3IgeCBpbiByYW5nZSh3KV0KICAgICMgVW5mb3J0dW5hdGVseSwgaXQgZG9lcyBub3Qgd29yayBiZWNhdXNlIHZhbHVlKCkgdHJpZXMgdG8gYWNjZXNzCiAgICAjIHRoZSBhcnIgbGlzdC4KICAgIGFyciA9IFtdCiAgICBmb3IgeCBpbiByYW5nZSh3KTogYXJyLmFwcGVuZChbdmFsdWUoeCwgeSkgZm9yIHkgaW4gcmFuZ2UoaCldKQogICAgcmV0dXJuIG1pbihhcnJbeF1bZW5kXSBmb3IgeCBpbiByYW5nZSh3KSkKCnJhbmsgPSAxMCAqKiAxMDAwMAoKaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgICMgSGFza2VsbHdob3JlcyBzb3Nub29sZXkgYWdhaW4uCiAgICB0b0FycmF5MkQgPSBsYW1iZGEgYXJyOiBsaXN0KHppcCgqYXJyKSkKICAgIGdyYXBoID0gW1tpbmYsICAgNyAqIHJhbmssICAgOSAqIHJhbmssIGluZiwgaW5mLCAgMTQgKiByYW5rXSwKICAgICAgICAgICAgIFsgIDcgKiByYW5rLCBpbmYsICAxMCAqIHJhbmssICAxNSAqIHJhbmssIGluZiwgaW5mXSwKICAgICAgICAgICAgIFsgIDkgKiByYW5rLCAgMTAgKiByYW5rLCBpbmYsICAxMSAqIHJhbmssIGluZiwgICAyICogcmFua10sCiAgICAgICAgICAgICBbaW5mLCAgMTUgKiByYW5rLCAgMTEgKiByYW5rLCBpbmYsICAgNiAqIHJhbmssIGluZl0sCiAgICAgICAgICAgICBbaW5mLCBpbmYsIGluZiwgICA2ICogcmFuaywgaW5mLCAgIDkgKiByYW5rXSwKICAgICAgICAgICAgIFsgMTQgKiByYW5rLCBpbmYsICAgMiAqIHJhbmssIGluZiwgICA5ICogcmFuaywgaW5mXV0KICAgIHByaW50KHlvYmEodG9BcnJheTJEKGdyYXBoKSwgMCwgNCkpCg==