#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cmath>
#include <vector>
#include <set>
#include <map>
#include <unordered_set>
#include <unordered_map>
#include <queue>
#include <ctime>
#include <cassert>
#include <complex>
#include <string>
#include <cstring>
#include <chrono>
#include <random>
#include <queue>
#include <bitset>
using namespace std;
#ifdef LOCAL
#define eprintf(...) fprintf(stderr, __VA_ARGS__)
#else
#define eprintf(...) 42
#endif
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, int> pli;
typedef pair<ll, ll> pll;
typedef long double ld;
#define mp make_pair
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
const int MOD = (int)1e9 + 7;
int add(int x, int y) {
x += y;
if (x >= MOD) return x - MOD;
return x;
}
int sub(int x, int y) {
x -= y;
if (x < 0) return x + MOD;
return x;
}
int mult(int x, int y) {
return ((ll)x * y) % MOD;
}
int div2(int x) {
if (x & 1) x += MOD;
return x / 2;
}
const int N = 3030;
int a[N];
int xs[N];
int n, m, k;
int b[N][2];
int c[N], d[N];
int ans;
int main()
{
// freopen("input.txt", "r", stdin);
// freopen("output.txt", "w", stdout);
scanf("%d%d", &n, &m);
for (int i = 0; i < n; i++) {
scanf("%d", &a[i]);
xs[i] = a[i];
}
sort(xs, xs + n);
k = unique(xs, xs + n) - xs;
for (int i = 0; i < n; i++)
a[i] = lower_bound(xs, xs + k, a[i]) - xs;
for (int i = 0; i < m; i++)
for (int j = 0; j < 2; j++) {
scanf("%d", &b[i][j]);
b[i][j]--;
}
for (int it = k - 1; it >= 0; it--) {
for (int i = 0; i < n; i++)
c[i] = (int)(a[i] == it);
for (int i = 0; i < m; i++) {
int x = div2(add(c[b[i][0]], c[b[i][1]]));
c[b[i][0]] = c[b[i][1]] = x;
}
int sum = 0;
for (int i = 0; i < n; i++) {
ans = add(ans, mult(sum, c[i]));
ans = add(ans, div2(mult(c[i], d[i])));
sum = add(sum, d[i]);
d[i] = add(d[i], c[i]);
}
}
for (int i = 0; i < m; i++) {
ans = add(ans, ans);
}
printf("%d\n", ans);
return 0;
}