program MoveMinFirstRow;
uses crt;

type
  TMatrix = array of array of integer;

procedure PrintMatrix(var matrix: TMatrix; rows, cols: integer);
var
  i, j: integer;
begin
  for i := 0 to rows - 1 do
  begin
    for j := 0 to cols - 1 do
      write(matrix[i][j]:4);
    writeln;
  end;
end;

procedure MoveMinFirstRow(var matrix: TMatrix; rows, cols: integer);
var
  minRow, i, j: integer;
  temp: array of integer;
begin
  // Находим строку с минимальным первым элементом
  minRow := 0;
  for i := 1 to rows - 1 do
    if matrix[i][0] < matrix[minRow][0] then
      minRow := i;

  // Если минимальная строка уже первая, ничего не делаем
  if minRow = 0 then exit;

  // Создаем временный массив для хранения минимальной строки
  SetLength(temp, cols);
  for j := 0 to cols - 1 do
    temp[j] := matrix[minRow][j];

  // Сдвигаем строки вниз от начала до minRow
  for i := minRow downto 1 do
    for j := 0 to cols - 1 do
      matrix[i][j] := matrix[i-1][j];

  // Копируем минимальную строку в первую позицию
  for j := 0 to cols - 1 do
    matrix[0][j] := temp[j];
end;

var
  matrix: TMatrix;
  rows, cols, i, j: integer;
begin
  clrscr;
  
  // Пример матрицы из задания
  rows := 3;
  cols := 4;
  
  SetLength(matrix, rows, cols);
  
  // Заполняем матрицу
  matrix[0][0] := 2; matrix[0][1] := 4; matrix[0][2] := 1; matrix[0][3] := 5;
  matrix[1][0] := 3; matrix[1][1] := 5; matrix[1][2] := 2; matrix[1][3] := 7;
  matrix[2][0] := 1; matrix[2][1] := 2; matrix[2][2] := 1; matrix[2][3] := 4;
  
  writeln('Исходная матрица:');
  PrintMatrix(matrix, rows, cols);
  
  MoveMinFirstRow(matrix, rows, cols);
  
  writeln;
  writeln('Матрица после перемещения:');
  PrintMatrix(matrix, rows, cols);
  
  readkey;
end.