//1005
#include<iostream>
#include<vector>
void FindConstructionTime(int* timeOfConstruction, std::vector<int> order[],
const int to, const int from, const int* time)
{
if (to != -1)
{
//find max
timeOfConstruction[from] =
timeOfConstruction[from] > timeOfConstruction[to] + time[from] ?
timeOfConstruction[from] : timeOfConstruction[to] + time[from];
}
else // 최종 건물 W의 경우
{
timeOfConstruction[from] = time[from];
}
while (order[from].empty() == false)
{
FindConstructionTime(timeOfConstruction, order,
from, order[from].back(), time);
order[from].pop_back();
}
}
int main()
{
int t;
scanf("%d", &t);
for (int tc = 0; tc < t; tc++)
{
//입력--------------------------
int n, k;
scanf("%d %d", &n, &k);
int* time = new int[n];
int* timeOfConstruction = new int[n];
for (int i = 0; i < n; i++)
{
scanf("%d", &time[i]);
timeOfConstruction[i] = 0;
}
std::vector<int> order[1001];
for (int i = 0; i < k; i++)
{
int from, to;
scanf("%d %d", &from, &to);
from--;
to--;
order[to].push_back(from);
}
int w;
scanf("%d", &w);
w--;
//건축시간 계산----------------------
FindConstructionTime(timeOfConstruction, order, -1, w, time);
//최종 건축시간 중 critical pass를 찾는다.
int max = 0;
for (int i = 0; i < n; i++)
{
if (max < timeOfConstruction[i])
{
max = timeOfConstruction[i];
}
}
printf("%d\n", max);
if (time) delete time;
if (timeOfConstruction) delete timeOfConstruction;
}
return 0;
}
Ly8xMDA1CiNpbmNsdWRlPGlvc3RyZWFtPgojaW5jbHVkZTx2ZWN0b3I+Cgp2b2lkIEZpbmRDb25zdHJ1Y3Rpb25UaW1lKGludCogdGltZU9mQ29uc3RydWN0aW9uLCBzdGQ6OnZlY3RvcjxpbnQ+IG9yZGVyW10sIAogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCB0bywgY29uc3QgaW50IGZyb20sIGNvbnN0IGludCogdGltZSkKewoJaWYgKHRvICE9IC0xKQoJewogICAgICAgIC8vZmluZCBtYXgKCQl0aW1lT2ZDb25zdHJ1Y3Rpb25bZnJvbV0gPQoJCQl0aW1lT2ZDb25zdHJ1Y3Rpb25bZnJvbV0gPiB0aW1lT2ZDb25zdHJ1Y3Rpb25bdG9dICsgdGltZVtmcm9tXSA/CgkJCXRpbWVPZkNvbnN0cnVjdGlvbltmcm9tXSA6IHRpbWVPZkNvbnN0cnVjdGlvblt0b10gKyB0aW1lW2Zyb21dOwoJfQoJZWxzZSAvLyDstZzsooUg6rG066y8IFfsnZgg6rK97JqwCgl7CgkJdGltZU9mQ29uc3RydWN0aW9uW2Zyb21dID0gdGltZVtmcm9tXTsKCX0KICAgIAoJd2hpbGUgKG9yZGVyW2Zyb21dLmVtcHR5KCkgPT0gZmFsc2UpCgl7CgkJRmluZENvbnN0cnVjdGlvblRpbWUodGltZU9mQ29uc3RydWN0aW9uLCBvcmRlciwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSwgb3JkZXJbZnJvbV0uYmFjaygpLCB0aW1lKTsKCQlvcmRlcltmcm9tXS5wb3BfYmFjaygpOwoJfQp9CmludCBtYWluKCkKewoJaW50IHQ7CglzY2FuZigiJWQiLCAmdCk7Cglmb3IgKGludCB0YyA9IDA7IHRjIDwgdDsgdGMrKykKCXsKCQkvL+yeheugpS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgaW50IG4sIGs7CgkJc2NhbmYoIiVkICVkIiwgJm4sICZrKTsKCQlpbnQqIHRpbWUgPSBuZXcgaW50W25dOwoJCWludCogdGltZU9mQ29uc3RydWN0aW9uID0gbmV3IGludFtuXTsKCQlmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykKCQl7CgkJCXNjYW5mKCIlZCIsICZ0aW1lW2ldKTsKCQkJdGltZU9mQ29uc3RydWN0aW9uW2ldID0gMDsKCQl9CgoJCXN0ZDo6dmVjdG9yPGludD4gb3JkZXJbMTAwMV07CgoJCWZvciAoaW50IGkgPSAwOyBpIDwgazsgaSsrKQoJCXsKCQkJaW50IGZyb20sIHRvOwoJCQlzY2FuZigiJWQgJWQiLCAmZnJvbSwgJnRvKTsKCQkJZnJvbS0tOwoJCQl0by0tOwoJCQlvcmRlclt0b10ucHVzaF9iYWNrKGZyb20pOwoJCX0KCQlpbnQgdzsKCQlzY2FuZigiJWQiLCAmdyk7CgkJdy0tOwoJCS8v6rG07LaV7Iuc6rCEIOqzhOyCsC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICBGaW5kQ29uc3RydWN0aW9uVGltZSh0aW1lT2ZDb25zdHJ1Y3Rpb24sIG9yZGVyLCAtMSwgdywgdGltZSk7CgkJCiAgICAgICAgLy/stZzsooUg6rG07LaV7Iuc6rCEIOykkSBjcml0aWNhbCBwYXNz66W8IOywvuuKlOuLpC4gCiAgICAgICAgaW50IG1heCA9IDA7CgkJZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspCgkJewoJCQlpZiAobWF4IDwgdGltZU9mQ29uc3RydWN0aW9uW2ldKQoJCQl7CgkJCQltYXggPSB0aW1lT2ZDb25zdHJ1Y3Rpb25baV07CgkJCX0KCQl9CgkJcHJpbnRmKCIlZFxuIiwgbWF4KTsKCQkKICAgICAgICBpZiAodGltZSkgZGVsZXRlIHRpbWU7CgkJaWYgKHRpbWVPZkNvbnN0cnVjdGlvbikgZGVsZXRlIHRpbWVPZkNvbnN0cnVjdGlvbjsKCX0KCXJldHVybiAwOwp9