#include <bits/stdc++.h>
using namespace std;
#define FOR(i,a,b) for(int i=(a);i<=(b);++i)
#define MASK(i) (1LL<<(i))

const int N=305;
const int INF=1e9;

int m,n;
char a[N][N];
int dis[N][N][16];
int cost[N][N];

const int dx[]={-1,1,0,0};
const int dy[]={0,0,-1,1};
const int north=0;
const int south=3;
const int west=1;
const int east=2;

struct state
{
    int d,x,y;
    bool operator > (const state &o) const 
    {
        return d>o.d;
    }
};

int dijkstra(int s)
{
    FOR(i,1,m)
    FOR(j,1,n)
    {
        cost[i][j]=abs(a[i][j]-'0'-s);
        FOR(mask,0,15) dis[i][j][mask]=INF;
    }

    FOR(i,1,m)
    FOR(j,1,n)
    {
        int base_mask=0;
        if (i==1) base_mask|=MASK(north);
        if (j==1) base_mask|=MASK(west);
        if (i==m) base_mask|=MASK(south);
        if (j==n) base_mask|=MASK(east);
        
        dis[i][j][base_mask]=cost[i][j];
        for(int sub=base_mask;sub>0;sub=(sub-1)&base_mask)
        {
            if (dis[i][j][sub] > cost[i][j]) dis[i][j][sub] = cost[i][j];
        }
        dis[i][j][0]=cost[i][j];
    }

    priority_queue<state,vector<state>,greater<state>> pq;

    FOR(mask,1,15)
    {
        for(int sub = (mask - 1) & mask; sub > 0; sub = (sub - 1) & mask) 
        {
            int complement = mask ^ sub;
            if (sub < complement) continue;
            FOR(i,1,m)
            FOR(j,1,n)
            {
                if (dis[i][j][sub] < INF && dis[i][j][complement] < INF)
                {
                    long long val = dis[i][j][sub] + dis[i][j][complement] - cost[i][j];
                    if (dis[i][j][mask] > val) dis[i][j][mask] = val;
                }
            }
        }
        FOR(i,1,m)
        FOR(j,1,n)
        {
            if (dis[i][j][mask] < INF) pq.push({dis[i][j][mask],i,j});
        }
        while(!pq.empty())
        {
            int d=pq.top().d,x=pq.top().x,y=pq.top().y;
            pq.pop();
            
            if (d>dis[x][y][mask]) continue;
            
            FOR(k,0,3)
            {
                int nx=x+dx[k];
                int ny=y+dy[k];
                if (nx>=1&&nx<=m&&ny>=1&&ny<=n)
                {
                    if (dis[nx][ny][mask] > d + cost[nx][ny])
                    {
                        dis[nx][ny][mask] = d + cost[nx][ny];
                        pq.push({dis[nx][ny][mask],nx,ny});
                    }
                }
            }
        }
    }

    int ans=INF;
    FOR(i,1,m) FOR(j,1,n) if (ans > dis[i][j][15]) ans = dis[i][j][15];
    return ans;
}

int32_t main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    int t;
    if (cin>>t)
    {
        while(t--)
        {
            cin>>m>>n;
            FOR(i,1,m)
            FOR(j,1,n) cin>>a[i][j];
            
            int ans=INF;
            FOR(s,0,9) {
                int res = dijkstra(s);
                if (ans > res) ans = res;
            }
            cout<<ans<<'\n';
        }
    }
    return 0;
}