#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <stack>
#include <algorithm>
#include <cstdio>
#include <map>
#include <string>
using namespace std;
typedef pair<int, int> iPair;
vector<int> mapper;
int p[11][11];
vector<iPair> dist[250010];
vector<iPair> ini[250010];
int sdist[250010];
bool visited[250010];
int main() {
ios::sync_with_stdio(false);
long long int n,m,k,s;
cin>>n>>m>>k>>s;
for(int i = 1; i <= k; i++) {
for(int j = 1; j <= k; j++) {
cin>>p[i][j];
}
}
mapper.resize(n*10+10);
//memset(sdist, 1e9, sizeof(long long int) * (n+2));
int count = 1;
int a,b,c,d,other,num,num1,first,second,so;
for(int i = 0; i < m; i++) {
cin>>a>>b>>c>>d;
if(a == s || b == s) {
so = s*10+1;
if(mapper[so] == 0) {
mapper[so] = count++;
}
other = (a==s) ? b*10+d:a*10+d;
if(mapper[other] == 0) {
mapper[other] = count++;
}
num = mapper[so], num1 = mapper[other];
dist[num].push_back(make_pair(c, num1));
} else {
first = a*10+d;
second = b*10 + d;
if(mapper[first] == 0) {
mapper[first] = count++;
}
if(mapper[second] == 0) {
mapper[second] = count++;
}
num = mapper[first], num1 = mapper[second];
ini[num].push_back(make_pair(c+p[d][d], num1));
ini[num1].push_back(make_pair(c+p[d][d], num));
}
}
for(int i = 1; i <= n; i++) {
if(i!=s) {
for(int j = 1; j <= k; j++) {
if(mapper[i*10+j] != 0) {
int num = mapper[i*10+j];
for(int l = j; l <= k ; l++) {
if(mapper[i*10 + l] != 0) {
int num1 = mapper[i*10 + l];
//cout<<num<<" "<<num1<<endl;
//cout<<"i"<<i<<endl;
//vector<iPair> temp;
for(iPair pp : ini[num1]) {
dist[num].push_back(make_pair(pp.first - p[l][l] + p[j][l], pp.second));
//cout<<pp.first - p[l][l] + p[j][l]<<endl;
}
if(num != num1) {
for(iPair pp : ini[num]) {
dist[num1].push_back(make_pair(pp.first - p[j][j] + p[l][j], pp.second));
//cout<<pp.first - p[j][j] + p[l][j]<<endl;
}
}
}
}
ini[num].clear();
}
}
}
}
priority_queue< iPair, vector <iPair> , greater<iPair> > pq;
int ss = mapper[s*10+1];
for(int i = 1; i <= count; i++) {
sdist[i] = (1<<31)-1;
}
sdist[ss] = 0;
pq.push(make_pair(0,ss));
while(!pq.empty()) {
int u = pq.top().second;
//cout<<"U:"<<u<<" "<<pq.top().first<<endl;
pq.pop();
if(!visited[u]) {
visited[u] = true;
for(int i = 0; i<dist[u].size(); i++) {
int dd = dist[u][i].first;
int v = dist[u][i].second;
//cout<<dd<<endl;
/*if(dd==0) {
cout<<"something"<<endl;
}*/
//cout<<"v:"<<v<<" "<<sdist[v]<<endl;
if(sdist[v] > sdist[u]+dd) {
//cout<<"something"<<endl;
sdist[v] = sdist[u]+dd;
pq.push(make_pair(sdist[v],v));
}
}
}
}
int temp;
for(int i = 1; i <= n; i++) {
int mini = (1<<31)-1;
if(i!=s) {
for(int j = 1; j <= k; j++) {
temp = sdist[mapper[i*10+j]];
if(temp!=0) {
mini = min(temp, mini);
}
}
}
else {
mini = 0;
}
if(mini == (1<<31)-1) {
mini = -1;
}
cout<<mini<<" ";
}
cout<<endl;
}