1 #include<iostream>
2 #include<cstdio>
3 #include<cstring>
4 #include<string>
5 #include<algorithm>
6 #include<vector>
7 #include<cmath>
8 #include<queue>
9 #define N 2000039
10 #define M 6000039
11 #define ll long long
12 #define inf 0x3f3f3f3f
13 using namespace std;
14 struct edge
15 {
16 int to,w,next;
17 }net[M];
18 int head[N],S,T,tot=0,dis[N];
19 bool inq[N];
20 queue<int> que;
21 void add(int u,int v,int w)
22 {
23 net[++tot].to=v,net[tot].w=w,net[tot].next=head[u],head[u]=tot;
24 net[++tot].to=u,net[tot].w=w,net[tot].next=head[v],head[v]=tot;
25 }
26 void spfa()
27 {
28 memset(dis,inf,sizeof(dis));
29 memset(inq,0,sizeof(inq));
30 que.push(S),dis[S]=0,inq[S]=1;
31 int a,b;
32 while(!que.empty())
33 {
34 a=que.front();
35 que.pop();
36 for(b=head[a];b!=-1;b=net[b].next)
37 {
38 if(dis[a]+net[b].w<dis[net[b].to])
39 {
40 dis[net[b].to]=dis[a]+net[b].w;
41 if(!inq[net[b].to])
42 {
43 inq[net[b].to]=1;
44 que.push(net[b].to);
45 }
46 }
47 }
48 inq[a]=0;
49 }
50 }
51 int main()
52 {
53 memset(head,-1,sizeof(head));
54 int n,m,ans=inf,a,b,c;
55 scanf("%d%d",&n,&m);
56 S=0,T=2*(n-1)*(m-1)+1;
57 if(n==1)
58 {
59 for(a=1;a<m;a++)
60 {
61 scanf("%d",&b);
62 ans=min(ans,b);
63 }
64 printf("%d",ans);
65 return 0;
66 }
67 if(m==1)
68 {
69 for(a=1;a<n;a++)
70 {
71 scanf("%d",&b);
72 ans=min(ans,b);
73 }
74 printf("%d",ans);
75 return 0;
76 }
77 for(a=1;a<m;a++)
78 {
79 scanf("%d",&b);
80 add(S,a,b);
81 }
82 for(a=2;a<n;a++)
83 {
84 for(b=1;b<m;b++)
85 {
86 scanf("%d",&c);
87 add(((a-1)*2-1)*(m-1)+b,(a-1)*2*(m-1)+b,c);
88 }
89 }
90 for(a=1;a<m;a++)
91 {
92 scanf("%d",&b);
93 add(((n-1)*2-1)*(m-1)+a,T,b);
94 }
95 for(a=1;a<n;a++)
96 {
97 scanf("%d",&b);
98 add((a*2-1)*(m-1)+1,T,b);
99 for(b=2;b<m;b++)
100 {
101 scanf("%d",&c);
102 add((a-1)*2*(m-1)+(b-1),(a*2-1)*(m-1)+b,c);
103 }
104 scanf("%d",&b);
105 add(S,(a*2-1)*(m-1),b);
106 }
107 for(a=1;a<n;a++)
108 {
109 for(b=1;b<m;b++)
110 {
111 scanf("%d",&c);
112 add((a-1)*2*(m-1)+b,(a*2-1)*(m-1)+b,c);
113 }
114 }
115 spfa();
116 printf("%d",dis[T]);
117 return 0;
118 }