import java.util.Scanner;

public class Main {

	static Scanner sc = new Scanner(System.in);

	public static void main(String[] args) {

		// 表の作成と入力
		int[][] table = CreateTable(sc.nextInt(), sc.nextInt());

		// 表示
		Print(table);
	}

	// 表の生成と入力し、表(2次元配列)を返す
	static int[][] CreateTable(int r, int c) {
		int table[][] = new int[r + 1][c + 1]; // 表を生成(+1は合計行列分)

		for (int y = 0; y < r; y++) {

			for (int x = 0; x < c; x++) {

				table[y][x] = sc.nextInt();

				table[y][c] += table[y][x]; // 最後列(行の合計)に値を加算
			}
		}

		// 最下行(列の合計)の計算
		for (int x = 0; x < c + 1; x++) {

			for (int y = 0; y < r; y++) {

				table[r][x] += table[y][x]; // 最下行(列合計)に値を加算
			}
		}
		return table;
	}

	// 表示処理
	static void Print(int[][] table) {
		// 出力用のループ
		for (int y = 0; y < table.length; y++) {

			System.out.print(table[y][0]);
			for (int x = 1; x < table[y].length; x++) {

				System.out.print(" " + table[y][x]);
			}
			System.out.println();
		}
	}

}
 import java.util.Scanner; Scanner java.util public class Main {

	static Scanner sc = new Scanner(System.in);

	public static void main(String[] args) {

		// 表の作成と入力
		int[][] table = CreateTable(sc.nextInt(), sc.nextInt());

		// 表示
		Print(table);
	}

	// 表の生成と入力し、表(2次元配列)を返す
	static int[][] CreateTable(int r, int c) {
		int table[][] = new int[r + 1][c + 1]; // 表を生成(+1は合計行列分)

		for (int y = 0; y < r; y++) {

			for (int x = 0; x < c; x++) {

				table[y][x] = sc.nextInt();

				table[y][c] += table[y][x]; // 最後列(行の合計)に値を加算
			}
		}

		// 最下行(列の合計)の計算
		for (int x = 0; x < c + 1; x++) {

			for (int y = 0; y < r; y++) {

				table[r][x] += table[y][x]; // 最下行(列合計)に値を加算
			}
		}
		return table;
	}

	// 表示処理
	static void Print(int[][] table) {
		// 出力用のループ
		for (int y = 0; y < table.length; y++) {

			System.out.print(table[y][0]);
			for (int x = 1; x < table[y].length; x++) {

				System.out.print(" " + table[y][x]);
			}
			System.out.println();
		}
	}

} Main static Scanner sc = new Scanner(System.in); sc new Scanner(System.in) public static void main(String[] args) {

		// 表の作成と入力
		int[][] table = CreateTable(sc.nextInt(), sc.nextInt());

		// 表示
		Print(table);
	} main {

		// 表の作成と入力
		int[][] table = CreateTable(sc.nextInt(), sc.nextInt());

		// 表示
		Print(table);
	} int[][] table = CreateTable(sc.nextInt(), sc.nextInt()); table CreateTable(sc.nextInt(), sc.nextInt()) CreateTable sc.nextInt() sc.nextInt sc sc.nextInt() sc.nextInt sc Print(table) Print table String[] args args // 表の生成と入力し、表(2次元配列)を返す
	static int[][] CreateTable(int r, int c) {
		int table[][] = new int[r + 1][c + 1]; // 表を生成(+1は合計行列分)

		for (int y = 0; y < r; y++) {

			for (int x = 0; x < c; x++) {

				table[y][x] = sc.nextInt();

				table[y][c] += table[y][x]; // 最後列(行の合計)に値を加算
			}
		}

		// 最下行(列の合計)の計算
		for (int x = 0; x < c + 1; x++) {

			for (int y = 0; y < r; y++) {

				table[r][x] += table[y][x]; // 最下行(列合計)に値を加算
			}
		}
		return table;
	} CreateTable {
		int table[][] = new int[r + 1][c + 1]; // 表を生成(+1は合計行列分)

		for (int y = 0; y < r; y++) {

			for (int x = 0; x < c; x++) {

				table[y][x] = sc.nextInt();

				table[y][c] += table[y][x]; // 最後列(行の合計)に値を加算
			}
		}

		// 最下行(列の合計)の計算
		for (int x = 0; x < c + 1; x++) {

			for (int y = 0; y < r; y++) {

				table[r][x] += table[y][x]; // 最下行(列合計)に値を加算
			}
		}
		return table;
	} int table[][] = new int[r + 1][c + 1]; table new int[r + 1][c + 1] r + 1 r 1 c + 1 c 1 for (int y = 0; y < r; y++) {

			for (int x = 0; x < c; x++) {

				table[y][x] = sc.nextInt();

				table[y][c] += table[y][x]; // 最後列(行の合計)に値を加算
			}
		} int y = 0; int y = 0; y 0 y < r y r y++ y++ y {

			for (int x = 0; x < c; x++) {

				table[y][x] = sc.nextInt();

				table[y][c] += table[y][x]; // 最後列(行の合計)に値を加算
			}
		} {

			for (int x = 0; x < c; x++) {

				table[y][x] = sc.nextInt();

				table[y][c] += table[y][x]; // 最後列(行の合計)に値を加算
			}
		} for (int x = 0; x < c; x++) {

				table[y][x] = sc.nextInt();

				table[y][c] += table[y][x]; // 最後列(行の合計)に値を加算
			} int x = 0; int x = 0; x 0 x < c x c x++ x++ x {

				table[y][x] = sc.nextInt();

				table[y][c] += table[y][x]; // 最後列(行の合計)に値を加算
			} {

				table[y][x] = sc.nextInt();

				table[y][c] += table[y][x]; // 最後列(行の合計)に値を加算
			} table[y][x] = sc.nextInt() table[y][x] table[y] table y x sc.nextInt() sc.nextInt sc table[y][c] += table[y][x] table[y][c] table[y] table y c table[y][x] table[y] table y x for (int x = 0; x < c + 1; x++) {

			for (int y = 0; y < r; y++) {

				table[r][x] += table[y][x]; // 最下行(列合計)に値を加算
			}
		} int x = 0; int x = 0; x 0 x < c + 1 x c + 1 c 1 x++ x++ x {

			for (int y = 0; y < r; y++) {

				table[r][x] += table[y][x]; // 最下行(列合計)に値を加算
			}
		} {

			for (int y = 0; y < r; y++) {

				table[r][x] += table[y][x]; // 最下行(列合計)に値を加算
			}
		} for (int y = 0; y < r; y++) {

				table[r][x] += table[y][x]; // 最下行(列合計)に値を加算
			} int y = 0; int y = 0; y 0 y < r y r y++ y++ y {

				table[r][x] += table[y][x]; // 最下行(列合計)に値を加算
			} {

				table[r][x] += table[y][x]; // 最下行(列合計)に値を加算
			} table[r][x] += table[y][x] table[r][x] table[r] table r x table[y][x] table[y] table y x return table; table int r r int c c // 表示処理
	static void Print(int[][] table) {
		// 出力用のループ
		for (int y = 0; y < table.length; y++) {

			System.out.print(table[y][0]);
			for (int x = 1; x < table[y].length; x++) {

				System.out.print(" " + table[y][x]);
			}
			System.out.println();
		}
	} Print {
		// 出力用のループ
		for (int y = 0; y < table.length; y++) {

			System.out.print(table[y][0]);
			for (int x = 1; x < table[y].length; x++) {

				System.out.print(" " + table[y][x]);
			}
			System.out.println();
		}
	} for (int y = 0; y < table.length; y++) {

			System.out.print(table[y][0]);
			for (int x = 1; x < table[y].length; x++) {

				System.out.print(" " + table[y][x]);
			}
			System.out.println();
		} int y = 0; int y = 0; y 0 y < table.length y table.length table table.length y++ y++ y {

			System.out.print(table[y][0]);
			for (int x = 1; x < table[y].length; x++) {

				System.out.print(" " + table[y][x]);
			}
			System.out.println();
		} {

			System.out.print(table[y][0]);
			for (int x = 1; x < table[y].length; x++) {

				System.out.print(" " + table[y][x]);
			}
			System.out.println();
		} System.out.print(table[y][0]) System.out.print System.out System System.out table[y][0] table[y] table y 0 for (int x = 1; x < table[y].length; x++) {

				System.out.print(" " + table[y][x]);
			} int x = 1; int x = 1; x 1 x < table[y].length x table[y].length table[y] table y table[y].length x++ x++ x {

				System.out.print(" " + table[y][x]);
			} {

				System.out.print(" " + table[y][x]);
			} System.out.print(" " + table[y][x]) System.out.print System.out System System.out " " + table[y][x] " " table[y][x] table[y] table y x System.out.println() System.out.println System.out System System.out int[][] table table public class Main {

	static Scanner sc = new Scanner(System.in);

	public static void main(String[] args) {

		// 表の作成と入力
		int[][] table = CreateTable(sc.nextInt(), sc.nextInt());

		// 表示
		Print(table);
	}

	// 表の生成と入力し、表(2次元配列)を返す
	static int[][] CreateTable(int r, int c) {
		int table[][] = new int[r + 1][c + 1]; // 表を生成(+1は合計行列分)

		for (int y = 0; y < r; y++) {

			for (int x = 0; x < c; x++) {

				table[y][x] = sc.nextInt();

				table[y][c] += table[y][x]; // 最後列(行の合計)に値を加算
			}
		}

		// 最下行(列の合計)の計算
		for (int x = 0; x < c + 1; x++) {

			for (int y = 0; y < r; y++) {

				table[r][x] += table[y][x]; // 最下行(列合計)に値を加算
			}
		}
		return table;
	}

	// 表示処理
	static void Print(int[][] table) {
		// 出力用のループ
		for (int y = 0; y < table.length; y++) {

			System.out.print(table[y][0]);
			for (int x = 1; x < table[y].length; x++) {

				System.out.print(" " + table[y][x]);
			}
			System.out.println();
		}
	}

} public class Main {

	static Scanner sc = new Scanner(System.in);

	public static void main(String[] args) {

		// 表の作成と入力
		int[][] table = CreateTable(sc.nextInt(), sc.nextInt());

		// 表示
		Print(table);
	}

	// 表の生成と入力し、表(2次元配列)を返す
	static int[][] CreateTable(int r, int c) {
		int table[][] = new int[r + 1][c + 1]; // 表を生成(+1は合計行列分)

		for (int y = 0; y < r; y++) {

			for (int x = 0; x < c; x++) {

				table[y][x] = sc.nextInt();

				table[y][c] += table[y][x]; // 最後列(行の合計)に値を加算
			}
		}

		// 最下行(列の合計)の計算
		for (int x = 0; x < c + 1; x++) {

			for (int y = 0; y < r; y++) {

				table[r][x] += table[y][x]; // 最下行(列合計)に値を加算
			}
		}
		return table;
	}

	// 表示処理
	static void Print(int[][] table) {
		// 出力用のループ
		for (int y = 0; y < table.length; y++) {

			System.out.print(table[y][0]);
			for (int x = 1; x < table[y].length; x++) {

				System.out.print(" " + table[y][x]);
			}
			System.out.println();
		}
	}

} Main
import java.util.Scanner;

public class Main {

	static Scanner sc = new Scanner(System.in);

	public static void main(String[] args) {

		// 表の作成と入力
		int[][] table = CreateTable(sc.nextInt(), sc.nextInt());

		// 表示
		Print(table);
	}

	// 表の生成と入力し、表(2次元配列)を返す
	static int[][] CreateTable(int r, int c) {
		int table[][] = new int[r + 1][c + 1]; // 表を生成(+1は合計行列分)

		for (int y = 0; y < r; y++) {

			for (int x = 0; x < c; x++) {

				table[y][x] = sc.nextInt();

				table[y][c] += table[y][x]; // 最後列(行の合計)に値を加算
			}
		}

		// 最下行(列の合計)の計算
		for (int x = 0; x < c + 1; x++) {

			for (int y = 0; y < r; y++) {

				table[r][x] += table[y][x]; // 最下行(列合計)に値を加算
			}
		}
		return table;
	}

	// 表示処理
	static void Print(int[][] table) {
		// 出力用のループ
		for (int y = 0; y < table.length; y++) {

			System.out.print(table[y][0]);
			for (int x = 1; x < table[y].length; x++) {

				System.out.print(" " + table[y][x]);
			}
			System.out.println();
		}
	}

}

