商品
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+5;
int n, m, a, b, v[N], dist[N], f[N];
typedef pair<int, int> PII;
priority_queue<PII, vector<PII>, greater<PII>> q;
vector<int> s[N];
void dj(){
dist[a] = 0; //起点到起点的距离是0
q.push({0, a}); //加入队列{距离,点}
f[a] = 1; //a这个点入队
while(q.size()){ //只要队列不为空
PII t = q.top(); //优先队列队首是top
q.pop();
int x = t.second;
// f[x] = 0;
//尝试更新从最短标记x点出发所能到的所有点
for(int y : s[x]){ //遍历x所能走到的所有的点
if(dist[y] > dist[x] + 1){ //如果从x出发到y更短,那么就更新距离
dist[y] = dist[x] + 1;
if(f[y]) continue;
f[y] = 1;
q.push({dist[y], y});
}
}
}
}
int main(){
memset(dist, 0x3f, sizeof dist);
cin >> n >> m >> a >> b;
for(int i=0; i<n; i++) cin >> v[i]; //输入每个物品的价值
for(int i=1; i<=m; i++){ //m个商人
int x, y;
cin >> x >> y; //在第i个商人这儿,可以用x交换y
s[x].push_back(y); //x->y的有向图
}
dj(); //求出从起点商品a交换到每一种商品的路径长度
if(dist[b] == 0x3f3f3f3f) cout << "No solution";
else cout << v[b] - v[a] + dist[b];
return 0;
}