// Problem: 1517_D. Explorer Space
// Time complexity: cubic
import java.util.*;
import java.lang.*;
import java.io.*;

// Created by @thesupremeone on 23/04/21
public class ExplorerSpace {
    int[][] horizontal, vertical;
    int n, m;
    long[][][] dp;
    int large = Integer.MAX_VALUE;

    boolean isValid(int i, int j){
        return i>=0 && j>=0 && i<n && j<m;
    }

    long getMin(int i, int j, int k){
        if(k==0)
            return 0;
        if(dp[i][j][k]!=-1)
            return dp[i][j][k];
        long ans = large;
        for (int a = 0; a < 2; a++) {
            for (int d = 0; d < 2; d++) {
                int dx = a==0 ? (d==0 ? +1 : -1) : 0;
                int dy = a==1 ? (d==0 ? +1 : -1) : 0;
                int x = i+dx;
                int y = j+dy;
                if(isValid(x, y)){
                    if(dx==0){
                        ans = Math.min(horizontal[i][Math.min(j, y)]+getMin(x, y, k-1), ans);
                    }else {
                        ans = Math.min(vertical[Math.min(i, x)][j]+getMin(x, y, k-1), ans);
                    }
                }
            }
        }
        dp[i][j][k] = ans;
        return ans;
    }

    void solve() throws IOException {
        n = getInt();
        m = getInt();
        dp = new long[n+1][m+1][11];
        for (int i = 0; i < n+1; i++) {
            for (int j = 0; j < m+1; j++) {
                for (int k = 0; k < 11; k++) {
                    dp[i][j][k] = -1;
                }
            }
        }
        int k = getInt();
        horizontal = new int[n][m-1];
        vertical = new int[n-1][m];
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m - 1; j++) {
                horizontal[i][j] = getInt();
            }
        }
        for (int i = 0; i < n - 1; i++) {
            for (int j = 0; j < m; j++) {
                vertical[i][j] = getInt();
            }
        }
        if(k%2!=0){
            for (int i = 0; i < n; i++) {
                for (int j = 0; j < m; j++) {
                    print("-1 ");
                }
                println("");
            }
        }else {
            for (int i = 0; i < n; i++) {
                for (int j = 0; j < m; j++) {
                    long ans = 2*getMin(i, j, k/2);
                    print(ans+" ");
                }
                println("");
            }
        }
    }

    public static void main(String[] args) throws Exception {
        if (isOnlineJudge()) {
            in = new BufferedReader(new InputStreamReader(System.in));
            out = new BufferedWriter(new OutputStreamWriter(System.out));
            new ExplorerSpace().solve();
            out.flush();
        } else {
            Thread judge = new Thread();
            in = new BufferedReader(new FileReader("input.txt"));
            out = new BufferedWriter(new FileWriter("output.txt"));
            judge.start();
            new ExplorerSpace().solve();
            out.flush();
            judge.suspend();
        }
    }
    static boolean isOnlineJudge(){
        try {
            return System.getProperty("ONLINE_JUDGE")!=null
                    || System.getProperty("LOCAL")==null;
        }catch (Exception e){
            return true;
        }
    }
    // Fast Input & Output
    static BufferedReader in;
    static StringTokenizer st;
    static BufferedWriter out;
    static String getLine() throws IOException{
        return in.readLine();
    }
    static String getToken() throws IOException{
        if(st==null || !st.hasMoreTokens())
            st = new StringTokenizer(getLine());
        return st.nextToken();
    }
    static int getInt() throws IOException {
        return Integer.parseInt(getToken());
    }
    static long getLong() throws IOException {
        return Long.parseLong(getToken());
    }
    static void print(Object s) throws IOException{
        out.write(String.valueOf(s));
    }
    static void println(Object s) throws IOException{
        out.write(String.valueOf(s));
        out.newLine();
    }
}