#include<bits/stdc++.h>
#define int long long
#define double long double
using namespace std;
int n,m,x[100010],y[100010],z[50],q[50];double sum,d[50],f[41][1048576],ans;bool vst[50][50];
vector<int> u,v;
signed main(){
cin >> n >> m;
for(int i = 1;i <= n;i++){
cin >> x[i] >> y[i];
sum += x[i];
d[i] = (y[i] - x[i]) / 2.0;
}
for(int i = 1;i <= m;i++){
cin >> x[i] >> y[i];
if(x[i] == y[i]){
if(d[x[i]] > -0.4){
sum += 2 * d[x[i]];
d[x[i]] = -d[x[i]];
}
continue;
}
}
for(int i = 1;i <= n;i++){
if(d[i] > -0.4){
v.push_back(i);
z[i] = v.size() - 1;
}
else u.push_back(i);
}
for(int i = 1;i <= m;i++){
if(x[i] == y[i] || vst[x[i]][y[i]]) continue;
vst[x[i]][y[i]] = vst[y[i]][x[i]] = 1;
if(d[x[i]] > -0.4) q[y[i]] += (1 << z[x[i]]);
if(d[y[i]] > -0.4) q[x[i]] += (1 << z[y[i]]);
}
int o = 0;
for(int i = 1;i <= n;i++){
if(d[i] > -0.4) o = o | q[i];
}
if(u.size() < v.size()){
for(int i = 0;i < (1 << u.size());i++){
double cnt = 0;int l = 1,r = 1,p = o;
for(int j = 0;j < u.size();j++){
if((i / l) % 2){
cnt += d[u[j]];
p = p | q[u[j]];
}
if(i < l) break;
l = l * 2;
}
for(int j = 0;j < v.size();j++){
if((p / r) % 2) cnt += d[v[j]];
r = r * 2;
}
ans = max(ans,cnt);
}
}
else{
for(int i = 0;i <= u.size();i++){
for(int j = 1;j < (1 << v.size());j++) f[i][j] = -1000000000000000000;
}
for(int i = 0;i < u.size();i++){
for(int j = 0;j < (1 << v.size());j++){
f[i + 1][j] = max(f[i + 1][j],f[i][j]);
f[i + 1][j | q[u[i]]] = max(f[i][j] + d[u[i]],f[i + 1][j | q[u[i]]]);
}
}
for(int j = 0;j < (1 << v.size());j++){
double cnt = 0;int l = 1,k = j | o;
for(int i = 0;i < v.size();i++){
if((k / l) % 2) cnt += d[v[i]];
l = l * 2;
}
ans = max(ans,cnt + f[u.size()][j]);
}
}
cout << fixed << setprecision(7) << ans + sum;
return 0;
}
听取WA声一片