// Author: Ivan Kazmenko (gassa@mail.ru) // construct a chain of observations by repeatedly finding the closest one module solution; import std.algorithm, std.array, std.conv, std.stdio, std.string; immutable int infinity = int.max / 2; int dist (int [] u, int [] v) { int res = infinity; foreach (i; 0..u.length) if (u[i] && v[i] && u[i] > v[i]) res = min (res, u[i] - v[i]); return res; } int solve (int n, int m, int [] [] a) { int [] cur = a[0]; int res = 0; do { int [] next = a.minElement !(p => dist (cur, p)); int delta = dist (cur, next); if (delta == infinity) return -1; res += delta; cur = next; } while (cur != a[0]); return res; } void main () { int n, m; readf (" %s %s", &n, &m); readln; int [] [] a; foreach (k; 0..m) a ~= readln.split.map !(x => x == "X" ? 0 : x.to!int).array; writeln (solve (n, m, a)); }