/*
#include<iostream>
#include<cstdio>
#include<cstring>
#define MAXN 301
using namespace std;
int a1[MAXN*MAXN],a2[MAXN*MAXN],a3[MAXN*MAXN];
int n,ans1,ans2,ans3,g[MAXN][MAXN],max1,s,t,ss[MAXN][MAXN],tot,pre[MAXN*MAXN];
bool r[MAXN],b[MAXN];
int read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();
return x*f;
}
void print()
{
printf("%d ",ans1);
for(int i=n;i>=1;i--)
if(a1[i]) printf("%d ",a1[i]);
printf("
");
printf("%d ",ans2);
for(int i=n;i>=1;i--)
if(a2[i]) printf("%d ",a2[i]);
printf("
");
printf("%d ",ans3);
for(int i=n;i>=1;i--)
if(a3[i]) printf("%d ",a3[i]);
printf("
");
}
void slove()
{
int sum=0;int x=t;
if(tot<ans1)
{
if(a2[1])
{
for(int i=1;i<=n;i++)
a3[i]=a2[i];
ans3=ans2;
}
if(a1[1])
{
for(int i=1;i<=n;i++)
a2[i]=a1[i];
ans2=ans1;
}
ans1=tot;
memset(a1,0,sizeof(a1));
while(x)
{
a1[++sum]=x;
x=pre[x];
}
return ;
}
else if(tot<ans2)
{
if(a2[1])
{
for(int i=1;i<=n;i++)
a3[i]=a2[i];
ans3=ans2;
}
ans2=tot;
memset(a2,0,sizeof(a2));
while(x)
{
a2[++sum]=x;
x=pre[x];
}
return ;
}
else if(tot<ans3)
{
memset(a3,0,sizeof(a3));
ans3=tot;
while(x)
{
a3[++sum]=x;
x=pre[x];
}
return ;
}
}
void dfs(int x)
{
if(x==t)
{
slove();
}
for(int i=1;i<=n;i++)
if(g[x][i]&&!r[i]&&g[x][i]!=max1)
{
tot+=g[x][i];g[x][i]=0;pre[i]=x;r[i]=true;
dfs(i);
tot-=ss[x][i];g[x][i]=ss[x][i];pre[i]=0;r[i]=false;
}
}
int main()
{
ans1=ans2=ans3=1e8;
n=read();s=read();t=read();max1=read();
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
g[i][j]=read(),ss[i][j]=g[i][j];
r[s]=true;
dfs(s);
print();
}