Jenya has recently acquired quite a useful tool — k-scissors for cutting strings. They are generally used for cutting out two non-intersecting substrings of length k from an arbitrary string s (its length should be at least 2·k in order to perform this operation) and concatenating them afterwards (preserving the initial order). For example, with the help of 2-scissors you can cut ab and de out of abcde and concatenate them into abde, but not ab and bc since they're intersecting.

It's a nice idea to test this tool before using it in practice. After looking through the papers, Jenya came up with two strings s and t. His question is whether it is possible to apply his scissors to string s such that the resulting concatenation contains t as a substring?

Input

The first line contains three integers n, m, k (2 ≤ m ≤ 2·k ≤ n ≤ 5·105) — length of s, length of t and the aforementioned scissors' parameter correspondingly.

The next two lines feature s and t consisting of lowercase latin letters.

Output

If there is no answer, print «No». 

Otherwise print «Yes» and two integers L and R denoting the indexes where cutted substrings start (1-indexed). If there are several possible answers, output any.

Examples

Input

7 4 3
baabaab
aaaa


Output

Yes
1 5


Input

6 3 2
cbcbcb
bcc


Output

Yes
2 5


Input

7 5 3
aabbaaa
aaaaa


Output

No

Note

In the first sample case you can cut out two substrings starting at 1 and 5. The resulting string baaaab contains aaaa as a substring.

In the second sample case the resulting string is bccb.
#include <bits/stdc++.h>
using namespace std;
template <typename _T>
inline void read(_T &x) {
  x = 0;
  char s = getchar();
  int f = 1;
  while (s < '0' || s > '9') {
    f = 1;
    if (s == '-') f = -1;
    s = getchar();
  }
  while ('0' <= s && s <= '9') {
    x = (x << 3) + (x << 1) + s - '0';
    s = getchar();
  }
  x *= f;
}
const int np = 5e5 + 5;
char s[np], t[np];
char str[np * 2];
int bac[29];
unsigned long long p[np * 2];
int f[np], g[np];
const unsigned long long base = 29;
unsigned long long Hash1[np];
unsigned long long Hash2[np];
inline unsigned long long get1(int l, int r) {
  return Hash1[r] - Hash1[l - 1] * p[r - l + 1];
}
inline unsigned long long get2(int l, int r) {
  return Hash2[r] - Hash2[l - 1] * p[r - l + 1];
}
signed main() {
  int n, m, k;
  read(n);
  read(m);
  read(k);
  scanf("%s", s + 1);
  int lens = strlen(s + 1);
  scanf("%s", t + 1);
  int lent = strlen(t + 1);
  p[0] = 1;
  for (int i = 1; i <= max(lent, lens); i++) p[i] = p[i - 1] * base;
  for (int i = 1; i <= lens; i++)
    Hash1[i] = Hash1[i - 1] * base + (s[i] - 'a' + 1);
  for (int i = 1; i <= lent; i++)
    Hash2[i] = Hash2[i - 1] * base + (t[i] - 'a' + 1);
  if (lent > 2 * k) {
    cout << "No";
    return 0;
  }
  for (int i = lent; i <= lens; i++)
    if (get1(i - lent + 1, i) == Hash2[lent]) {
      int x = i - lent + 1;
      cout << "Yes" << '\n';
      if (x + k + k - 1 > n) {
        cout << n - 2 * k + 1 << " " << n - k + 1;
        return 0;
      }
      cout << x << " " << x + k;
      return 0;
    }
  int l(k);
  for (int i = 1; i <= lent; i++) {
    unsigned long long cas = Hash2[i];
    if (get1(k - i + 1, k) == cas) {
      f[i] = k;
      l = k;
      continue;
    }
    for (l += 1; l <= lens; l++)
      if (get1(l - i + 1, l) == cas) {
        if (l - k + 1 <= 0) continue;
        f[i] = l;
        break;
      }
  }
  reverse(s + 1, s + 1 + lens);
  reverse(t + 1, t + 1 + lent);
  for (int i = 1; i <= lens; i++)
    Hash1[i] = Hash1[i - 1] * base + (s[i] - 'a' + 1);
  for (int i = 1; i <= lent; i++)
    Hash2[i] = Hash2[i - 1] * base + (t[i] - 'a' + 1);
  l = k;
  for (int i = 1; i <= lent; i++) {
    unsigned long long cas = Hash2[i];
    if (get1(k - i + 1, k) == cas) {
      g[i] = lens - k + 1;
      l = k;
      continue;
    }
    for (l += 1; l <= lens; l++)
      if (get1(l - i + 1, l) == cas) {
        if (g[i] + k - 1 > n) continue;
        g[i] = lens - l + 1;
        break;
      }
  }
  for (int i = 1; i <= lent; i++) {
    if (f[i] < g[lent - i] && f[i] && g[lent - i]) {
      if (k < i) continue;
      if (lent - i > k) continue;
      cout << "Yes" << '\n';
      cout << (f[i] - k + 1) << " " << g[lent - i] << '\n';
      return 0;
    }
  }
  cout << "No";
}
