MLE,10分
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define gc getchar
#define pc putchar
#define pb push_back
#define ls u<<1
#define rs u<<1|1
#define mp(i,j) make_pair(i,j)
const int ri=1e3+5;
const int dx[4]={1,0,-1,0},dy[4]={0,1,0,-1};
template<typename T>inline void read(T&x){x=0;int f=1;char ch=gc();while(!isdigit(ch)){if(ch=='-') f=-1;ch=gc();}while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=gc();}x*=f;}
template<typename T,typename ...T1>inline void read(T&x,T1&...x1){read(x);read(x1...);}
struct node{
int x,y,dis;
bool operator<(const node &a)const{
return a.dis<dis;
}
};
int n,m,a,b,c,ans=1e18,res;
int e[ri][ri];
bool vis[ri][ri];
bool in(int x,int y){
return 1<=x&&x<=n&&1<=y&&y<=m;
}
int bfs(int sx,int sy,int ex,int ey){
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
vis[i][j]=0;
}
}
int ans=1e18;
queue<node> q;
q.push({sx,sy,e[sx][sy]});
while(q.size()){
node t=q.front();
q.pop();
if(t.x==ex&&t.y==ey){
ans=min(ans,t.dis);
continue;
}
vis[t.x][t.y]=1;
for(int i=0;i<=3;i++){
int nx=t.x+dx[i],ny=t.y+dy[i];
if(!vis[nx][ny]&&in(nx,ny)&&t.dis<ans){
q.push({nx,ny,t.dis+e[nx][ny]});
}
}
}
return ans;
}
main(){
read(n,m,a,b,c);
for(int i=n;i>=1;i--){
for(int j=1;j<=m;j++){
read(e[i][j]);
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
res=bfs(n,a,i,j)+bfs(i,j,1,b)+bfs(i,j,1,c);
ans=min(ans,res-2*e[i][j]);
}
}
printf("%lld\n",ans);
return 0;
}