#include <iostream>
#include <iomanip>
#include <math.h>
using namespace std;
struct node {int su; int del; int st;} vert[100];
int a[100][100], e[100][100];
int n, s, t;
void tipar(int X[][100], int n)
{
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++) cout << setw(4) << X[i][j];
cout << endl;
}
cout <<"\n ------------------ \n " << endl;
}
void tipartraseu()
{
for (int i = 1; i <= n; i++)
cout << i <<" " << vert[i].su << " " << vert[i].del <<" "<< vert[i].st << endl;
}
void resetvert()
{
for (int i = 1; i <= n; i++) vert[i].su = vert[i]. del = vert[i].st = 0;
// reinitializare
vert[s].su = s;
vert[s].del = +1e09;
vert[s].st =1;
}
int potcontinua()
{
for (int i = 1; i <= n; i++) if( vert[i].st == 1) return i;
return 0;
}
int mic (int a, int b)
{
if (a < b) return a; else return b;
}
int main()
{
// citire date
cin >> n;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++) cin >> a[i][j];
cin >> s >> t;
tipar(a, n);
// pornim
increase :
resetvert();
do
{
int x = potcontinua();
// analizam G+
for (int i =1; i <= n; i++)
if (a[x][i] > 0 && a[x][i] > e[x][i] && vert[i].st == 0)
{
int del = a[x][i] - e[x][i];
if (del < vert[x].del) vert[i].del = del;
else
if (vert[x].del > 0) vert[i].del = vert[x].del;
else vert[i].del = mic (del, abs(vert[x].del));
vert[i].su = x, vert[i].st = 1;
}
// analizam G-
for (int i =1; i <= n; i++)
if (a[i][x] > 0 && vert[i].st == 0 && e[i][x] > 0)
{
int del = e[i][x];
if (del < vert[x].del) vert[i].del = -del;
else vert[i].del = -vert[x].del;
vert[i].su = x, vert[i].st = 1;
}
vert[x].st = 2;
} while (potcontinua() && vert[t].st == 0);
if (vert[t].st)
{
int delta = abs(vert[t].del); // cresterea fluxului
int vc = t, pr;
while (vc != s)
{
pr = vert[vc].su;
if (vert[vc].del > 0) e[pr][vc] = e[pr][vc] + delta;
else e[pr][vc] = e[pr][vc] - delta;
vc = pr;
}
tipartraseu();
tipar(e,n);
goto increase;
}
return 0;
}