#include <bits/stdc++.h>   int min(int a, int b) { return a < b ? a : b; }   int max(int a, int b) { return a > b ? a : b; }   unsigned int X;   void srand_() {     struct timeval tv;     gettimeofday(&tv, NULL);     X = tv.tv_sec ^ tv.tv_usec | 1;   }   int rand_() { return (X *= 3) >> 1; }   int *ej[1000], eo[1000];   void append(int i, int j) {     int o = eo[i]++;     if (o >= 2 && (o & o - 1) == 0)       ej[i] = (int *)realloc(ej[i], o * 2 * sizeof *ej[i]);     ej[i][o] = j;   }   int aa[1000], bb[1000], ii[1000], n;   int compare(int i, int j) { return aa[i] != aa[j] ? aa[i] - aa[j] : i - j; }   void sort(int *ii, int l, int r) {     while (l < r) {       int i = l, j = l, k = r, i_ = ii[l + rand_() % (r - l)], tmp;       while (j < k) {         int c = compare(ii[j], i_);         if (c == 0)           j++;         else if (c < 0) {           tmp = ii[i], ii[i] = ii[j], ii[j] = tmp;           i++, j++;         } else {           k--;           tmp = ii[j], ii[j] = ii[k], ii[k] = tmp;         }       }       sort(ii, l, i);       l = k;     }   }   char visited[1000];   int qu[1000], cnt;   int i_;   void dfs1(int i) {     int o;     if (visited[i] || compare(i, i_) > 0) return;     visited[i] = 1;     qu[cnt++] = i;     for (o = eo[i]; o--;) {       int j = ej[i][o];       dfs1(j);     }   }   char add[1000];   int cc[1000][1000];   void dfs2(int p, int i, int c) {     int o;     for (o = eo[i]; o--;) {       int j = ej[i][o];       if (j != p) {         if (compare(j, i_) > 0)           cc[i_][j] = max(cc[i_][j], c);         else           dfs2(i, j, min(c + bb[j], 0x3f3f3f3f));       }     }   }   int dp[1000];   int solve(int s) {     int g;     memset(dp, 0, n * sizeof *dp), dp[0] = s;     for (g = 0; g < n; g++) {       int i_ = ii[g], x = dp[i_], j;       if (x == 0) continue;       for (j = 0; j < n; j++)         if (compare(i_, j) < 0 && cc[i_][j] != -1) {           int c = add[i_] ? min(x + cc[i_][j], 0x3f3f3f3f)                           : min(s + cc[i_][j], 0x3f3f3f3f);           if (c >= aa[j]) dp[j] = max(dp[j], min(c + bb[j], 0x3f3f3f3f));         }     }     return dp[ii[n - 1]] > 0;   }   int main() {     int t;     srand_();     scanf( %d , &t);     while (t--) {       static int qu_[1000], dd[1000], pp[1000];       int m, g, h, i, j, o, cnt_, lower, upper;       scanf( %d%d , &n, &m);       aa[0] = 0;       for (i = 1; i < n; i++) scanf( %d , &aa[i]), aa[i]++;       for (i = 1; i < n; i++) scanf( %d , &bb[i]);       for (i = 0; i < n; i++) ej[i] = (int *)malloc(2 * sizeof *ej[i]), eo[i] = 0;       for (h = 0; h < m; h++) {         scanf( %d%d , &i, &j), i--, j--;         append(i, j), append(j, i);       }       for (i = 0; i < n; i++) ii[i] = i;       sort(ii, 0, n);       for (g = 0; g < n; g++) {         i_ = ii[g];         memset(visited, 0, n * sizeof *visited), cnt = 0;         memset(cc[i_], -1, n * sizeof *cc[i_]);         dfs1(0);         if (visited[i_]) {           int tree, p;           memset(dd, 0, n * sizeof *dd);           memset(pp, -1, n * sizeof *pp);           for (h = 0; h < cnt; h++) {             i = qu[h];             for (o = eo[i]; o--;) {               j = ej[i][o];               if (visited[j]) dd[i]++;             }           }           cnt_ = 0;           for (h = 0; h < cnt; h++) {             i = qu[h];             if (dd[i] == 1) qu_[cnt_++] = i;           }           while (cnt_) {             i = qu_[--cnt_];             dd[i] = -1;             for (o = eo[i]; o--;) {               j = ej[i][o];               if (dd[j] > 0) {                 pp[i] = j;                 if (--dd[j] == 1) qu_[cnt_++] = j;               }             }           }           tree = 1;           for (h = 0; h < cnt; h++) {             i = qu[h];             if (dd[i] > 0) {               tree = 0;               break;             }           }           p = -1, i = 0;           while (i != -1 && dd[i] <= 0 && i != i_) p = i, i = pp[i];           add[i_] = 1;           if (dd[i_] <= 0 && i != i_)             dfs2(pp[i_], i_, 0);           else if (tree)             dfs2(p, i_, 0);           else {             int c;             add[i_] = 0;             c = 0;             for (i = 0; i != -1 && dd[i] <= 0; i = pp[i])               c = min(c + bb[i], 0x3f3f3f3f);             for (h = 0; h < cnt; h++) {               i = qu[h];               if (dd[i] > 0) c = min(c + bb[i], 0x3f3f3f3f);             }             for (p = -1, i = 0; i != -1 && dd[i] <= 0; p = i, i = pp[i])               for (o = eo[i]; o--;) {                 j = ej[i][o];                 if (compare(j, i_) > 0)                   cc[i_][j] = max(cc[i_][j], c);                 else if (j != pp[i] && j != p)                   dfs2(i, j, min(c + bb[j], 0x3f3f3f3f));               }             for (h = 0; h < cnt; h++) {               i = qu[h];               if (dd[i] > 0)                 for (o = eo[i]; o--;) {                   j = ej[i][o];                   if (compare(j, i_) > 0)                     cc[i_][j] = max(cc[i_][j], c);                   else if (pp[j] == i && j != p)                     dfs2(i, j, min(c + bb[j], 0x3f3f3f3f));                 }             }           }         }       }       lower = 0, upper = 0x3f3f3f3f;       while (upper - lower > 1) {         int s = (lower + upper) / 2;         if (solve(s))           upper = s;         else           lower = s;       }       printf( %d n , upper);       for (i = 0; i < n; i++) free(ej[i]);     }     return 0;   }