#include <stdio.h>
#define MAX 5
int readMatrix(int matrix[][MAX], int rows, int columns);
void displayMatrix(int matrix[][MAX], int rows, int columns);
void multiplyMatrices(int a[][MAX], int b[][MAX], int product[][MAX], int rows, int shared, int columns);
int main(void)
{
    int a[MAX][MAX], b[MAX][MAX], product[MAX][MAX];
    int r1, c1, r2, c2;
    if (scanf("%d%d%d%d", &r1, &c1, &r2, &c2) != 4 ||
        r1 < 1 || r1 > MAX || c1 < 1 || c1 > MAX || r2 < 1 || r2 > MAX || c2 < 1 || c2 > MAX) {
        puts("Enter four dimensions from 1 to 5."); return 1;
    }
    if (c1 != r2) { puts("Cannot multiply: columns of A must equal rows of B."); return 1; }
    if (!readMatrix(a, r1, c1) || !readMatrix(b, r2, c2)) {
        puts("Enter matrix values from -20 to 20."); return 1;
    }
    multiplyMatrices(a, b, product, r1, c1, c2);
    printf("Matrix A (%d x %d):\n", r1, c1); displayMatrix(a, r1, c1);
    printf("Matrix B (%d x %d):\n", r2, c2); displayMatrix(b, r2, c2);
    printf("Product (%d x %d):\n", r1, c2); displayMatrix(product, r1, c2);
    return 0;
}
int readMatrix(int matrix[][MAX], int rows, int columns)
{
    int i, j;
    for (i = 0; i < rows; i++) {
        for (j = 0; j < columns; j++) {
            if (scanf("%d", &matrix[i][j]) != 1 || matrix[i][j] < -20 || matrix[i][j] > 20) return 0;
        }
    }
    return 1;
}
void displayMatrix(int matrix[][MAX], int rows, int columns)
{
    int i, j;
    for (i = 0; i < rows; i++) {
        for (j = 0; j < columns; j++) printf("%s%d", j ? " " : "", matrix[i][j]);
        putchar('\n');
    }
}
void multiplyMatrices(int a[][MAX], int b[][MAX], int product[][MAX], int rows, int shared, int columns)
{
    int i, j, k;
    for (i = 0; i < rows; i++) {
        for (j = 0; j < columns; j++) {
            product[i][j] = 0;
            for (k = 0; k < shared; k++) product[i][j] += a[i][k] * b[k][j];
        }
    }
}
