Problem:
Score : 400 points

Problem Statement

Joisino the magical girl has decided to turn every single digit that exists on this world into 1.

Rewriting a digit i with j (0≤i,j≤9) costs c_{i,j} MP (Magic Points).

She is now standing before a wall. The wall is divided into HW squares in H rows and W columns, and at least one square contains a digit between 0 and 9 (inclusive).

You are given A_{i,j} that describes the square at the i-th row from the top and j-th column from the left, as follows:

If A_{i,j}≠-1, the square contains a digit A_{i,j}.

If A_{i,j}=-1, the square does not contain a digit.

Find the minimum total amount of MP required to turn every digit on this wall into 1 in the end.

Constraints

1≤H,W≤200

1≤c_{i,j}≤10^3 (i≠j)

c_{i,j}=0 (i=j)

-1≤A_{i,j}≤9

All input values are integers.

There is at least one digit on the wall.

Input

Input is given from Standard Input in the following format:

H W
c_{0,0} ... c_{0,9}
:
c_{9,0} ... c_{9,9}
A_{1,1} ... A_{1,W}
:
A_{H,1} ... A_{H,W}

Output

Print the minimum total amount of MP required to turn every digit on the wall into 1 in the end.

Sample Input 1

2 4
0 9 9 9 9 9 9 9 9 9
9 0 9 9 9 9 9 9 9 9
9 9 0 9 9 9 9 9 9 9
9 9 9 0 9 9 9 9 9 9
9 9 9 9 0 9 9 9 9 2
9 9 9 9 9 0 9 9 9 9
9 9 9 9 9 9 0 9 9 9
9 9 9 9 9 9 9 0 9 9
9 9 9 9 2 9 9 9 0 9
9 2 9 9 9 9 9 9 9 0
-1 -1 -1 -1
8 1 1 8

Sample Output 1

12

To turn a single 8 into 1, it is optimal to first turn 8 into 4, then turn 4 into 9, and finally turn 9 into 1, costing 6 MP.

The wall contains two 8s, so the minimum total MP required is 6×2=12.

Sample Input 2

5 5
0 999 999 999 999 999 999 999 999 999
999 0 999 999 999 999 999 999 999 999
999 999 0 999 999 999 999 999 999 999
999 999 999 0 999 999 999 999 999 999
999 999 999 999 0 999 999 999 999 999
999 999 999 999 999 0 999 999 999 999
999 999 999 999 999 999 0 999 999 999
999 999 999 999 999 999 999 0 999 999
999 999 999 999 999 999 999 999 0 999
999 999 999 999 999 999 999 999 999 0
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1

Sample Output 2

0

Note that she may not need to change any digit.

Sample Input 3

3 5
0 4 3 6 2 7 2 5 3 3
4 0 5 3 7 5 3 7 2 7
5 7 0 7 2 9 3 2 9 1
3 6 2 0 2 4 6 4 2 3
3 5 7 4 0 6 9 7 6 7
9 8 5 2 2 0 4 7 6 5
5 4 6 3 2 3 0 5 4 3
3 6 2 3 4 2 4 0 8 9
4 6 5 4 3 5 3 2 0 8
2 1 3 4 5 7 8 6 4 0
3 5 2 6 1
2 5 3 2 1
6 9 2 5 6

Sample Output 3

47

Solution in C# (Mono 4.6.2.0) (judge verdict: Accepted)

using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.IO;
using System.Linq;
using System.Linq.Expressions;
using static System.Console;
using static System.Math;
class Simple
{
    int H, W;
    int[,] c,A;
    void Solve() {
        //input
        H = io.Int;
        W = io.Int;
        c = new int[10, 10];
        A = new int[H, W];
        for (int i = 0; i < 10; ++i)
        for (int j = 0; j < 10; ++j)
            c[i, j] = io.Int;
        for (int i = 0; i < H; ++i)
        for (int j = 0; j < W; ++j)
            A[i, j] = io.Int;
        //cal
        var wf = new WarshallFloyd(10,false);
        for (int i = 0; i < 10; ++i)
        for (int j = 0; j < 10; ++j)
            wf.AddPath(i, j, c[i, j]);
        wf.Run();
        var ans = 0L;
        for (int i = 0; i < H; ++i)
        for (int j = 0; j < W; ++j)
            if (A[i, j] != -1) ans += wf.MinCost(A[i, j], 1);
        //ret
        WriteLine(ans);
    }

    SimpleIO io = new SimpleIO();
    public static void Main(string[] args) => new Simple().Stream();
    private void Stream() {
        //var exStdIn = new System.IO.StreamReader("stdin.txt");
        //SetIn(exStdIn);
        Solve();
        io.Flush();
    }
}
class WarshallFloyd
{
    bool    IsNonDir;
    int     VertexNum;
    int     EdgeNum;
    long    INF;
    long[,] G;
    public WarshallFloyd(int n, bool isNondir = true,long inf = long.MaxValue/2) {
        IsNonDir = isNondir;
        INF      = inf;
        Init(n);
    }
    public void Init(int n) {
        VertexNum = n;
        G = new long[VertexNum + 1, VertexNum + 1];
        for (int i = 0; i < VertexNum + 1; ++i)
        for (int j = 0; j < VertexNum + 1; ++j)
            G[i, j] = INF;
    }
    public void AddPath(int f, int t, long c = 1) {
        EdgeNum++;
        G[f, t] = Math.Min(G[f, t], c);
        if (IsNonDir) G[t, f] = Math.Min(G[t, f], c);
    }
    public virtual void AddPath(int[] f, int[] t) {
        for (int i = 0; i < f.Length; ++i) AddPath(f[i], t[i]);
    }
    public virtual void AddPath(int[] f, int[] t, long[] c) {
        for (int i = 0; i < f.Length; ++i) AddPath(f[i], t[i], c[i]);
    }
    public void Run() {
        for (int i = 0; i < VertexNum + 1; ++i)
        for (int j = 0; j < VertexNum + 1; ++j)
        for (int k = 0; k < VertexNum + 1; ++k)
            G[j, k] = Math.Min(G[j, k], G[j, i] + G[i, k]);
    }
    public long MinCost(int f, int t) => G[f, t];
}
class SimpleIO
{
    string[] _nextBuffer;
    int _bufferCnt;
    char[] cs = new char[] { ' ', '"', ',' };
    StreamWriter sw = new StreamWriter(OpenStandardOutput()) {
        AutoFlush = false
    };
    public SimpleIO() {
        _nextBuffer = new string[0];
        _bufferCnt = 0;
        SetOut(sw);
    }
    string Next() {
        if (_bufferCnt < _nextBuffer.Length)
            return _nextBuffer[_bufferCnt++];
        var st = ReadLine();
        while (st == "")
            st = ReadLine();
        if (st != null)
            _nextBuffer = st.Split(cs, StringSplitOptions.RemoveEmptyEntries);
        else
            st = "";
        _bufferCnt = 0;
        return _nextBuffer[_bufferCnt++];
    }
    public string String => Next();
    public char Char => char.Parse(String);
    public int Int => int.Parse(String);
    public long Long => long.Parse(String);
    public double Double => double.Parse(String);
    public void Flush() => Out.Flush();
}